diff options
| author | bors <bors@rust-lang.org> | 2023-03-13 16:54:43 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-03-13 16:54:43 +0000 |
| commit | 544b4cfe4de2119807eb4d874c2cf095c5587bc4 (patch) | |
| tree | a63afd5969c07f291a7c9bfa53baa214b8c003df /editors/code/src | |
| parent | c6da2f9d96a71bee04d194a85ed76edb0259db5b (diff) | |
| parent | b2f6fd4f961fc7e4fbfdb80cae2e6065f8436f15 (diff) | |
| download | rust-544b4cfe4de2119807eb4d874c2cf095c5587bc4.tar.gz rust-544b4cfe4de2119807eb4d874c2cf095c5587bc4.zip | |
Auto merge of #109069 - lnicola:rust-analyzer-2023-03-13, r=lnicola
:arrow_up: `rust-analyzer` r? `@ghost`
Diffstat (limited to 'editors/code/src')
| -rw-r--r-- | editors/code/src/commands.ts | 35 | ||||
| -rw-r--r-- | editors/code/src/ctx.ts | 34 | ||||
| -rw-r--r-- | editors/code/src/lsp_ext.ts | 3 | ||||
| -rw-r--r-- | editors/code/src/main.ts | 2 | ||||
| -rw-r--r-- | editors/code/src/toolchain.ts | 30 |
5 files changed, 73 insertions, 31 deletions
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts index 49a8ca4edba..f4a4579a92c 100644 --- a/editors/code/src/commands.ts +++ b/editors/code/src/commands.ts @@ -93,6 +93,14 @@ export function triggerParameterHints(_: CtxInit): Cmd { }; } +export function openLogs(ctx: CtxInit): Cmd { + return async () => { + if (ctx.client.outputChannel) { + ctx.client.outputChannel.show(); + } + }; +} + export function matchingBrace(ctx: CtxInit): Cmd { return async () => { const editor = ctx.activeRustEditor; @@ -405,12 +413,11 @@ export function syntaxTree(ctx: CtxInit): Cmd { }; } -// Opens the virtual file that will show the HIR of the function containing the cursor position -// -// The contents of the file come from the `TextDocumentContentProvider` -export function viewHir(ctx: CtxInit): Cmd { +function viewHirOrMir(ctx: CtxInit, xir: "hir" | "mir"): Cmd { + const viewXir = xir === "hir" ? "viewHir" : "viewMir"; + const requestType = xir === "hir" ? ra.viewHir : ra.viewMir; const tdcp = new (class implements vscode.TextDocumentContentProvider { - readonly uri = vscode.Uri.parse("rust-analyzer-hir://viewHir/hir.rs"); + readonly uri = vscode.Uri.parse(`rust-analyzer-${xir}://${viewXir}/${xir}.rs`); readonly eventEmitter = new vscode.EventEmitter<vscode.Uri>(); constructor() { vscode.workspace.onDidChangeTextDocument( @@ -452,7 +459,7 @@ export function viewHir(ctx: CtxInit): Cmd { ), position: client.code2ProtocolConverter.asPosition(rustEditor.selection.active), }; - return client.sendRequest(ra.viewHir, params, ct); + return client.sendRequest(requestType, params, ct); } get onDidChange(): vscode.Event<vscode.Uri> { @@ -461,7 +468,7 @@ export function viewHir(ctx: CtxInit): Cmd { })(); ctx.pushExtCleanup( - vscode.workspace.registerTextDocumentContentProvider("rust-analyzer-hir", tdcp) + vscode.workspace.registerTextDocumentContentProvider(`rust-analyzer-${xir}`, tdcp) ); return async () => { @@ -474,6 +481,20 @@ export function viewHir(ctx: CtxInit): Cmd { }; } +// Opens the virtual file that will show the HIR of the function containing the cursor position +// +// The contents of the file come from the `TextDocumentContentProvider` +export function viewHir(ctx: CtxInit): Cmd { + return viewHirOrMir(ctx, "hir"); +} + +// Opens the virtual file that will show the MIR of the function containing the cursor position +// +// The contents of the file come from the `TextDocumentContentProvider` +export function viewMir(ctx: CtxInit): Cmd { + return viewHirOrMir(ctx, "mir"); +} + export function viewFileText(ctx: CtxInit): Cmd { const tdcp = new (class implements vscode.TextDocumentContentProvider { readonly uri = vscode.Uri.parse("rust-analyzer-file-text://viewFileText/file.rs"); diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index e2a30e0cc45..1708d47cee7 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts @@ -282,18 +282,18 @@ export class Ctx { setServerStatus(status: ServerStatusParams | { health: "stopped" }) { let icon = ""; const statusBar = this.statusBar; + statusBar.tooltip = new vscode.MarkdownString("", true); + statusBar.tooltip.isTrusted = true; switch (status.health) { case "ok": - statusBar.tooltip = (status.message ?? "Ready") + "\nClick to stop server."; - statusBar.command = "rust-analyzer.stopServer"; + statusBar.tooltip.appendText(status.message ?? "Ready"); statusBar.color = undefined; statusBar.backgroundColor = undefined; break; case "warning": - statusBar.tooltip = - (status.message ? status.message + "\n" : "") + "Click to reload."; - - statusBar.command = "rust-analyzer.reloadWorkspace"; + if (status.message) { + statusBar.tooltip.appendText(status.message); + } statusBar.color = new vscode.ThemeColor("statusBarItem.warningForeground"); statusBar.backgroundColor = new vscode.ThemeColor( "statusBarItem.warningBackground" @@ -301,22 +301,32 @@ export class Ctx { icon = "$(warning) "; break; case "error": - statusBar.tooltip = - (status.message ? status.message + "\n" : "") + "Click to reload."; - - statusBar.command = "rust-analyzer.reloadWorkspace"; + if (status.message) { + statusBar.tooltip.appendText(status.message); + } statusBar.color = new vscode.ThemeColor("statusBarItem.errorForeground"); statusBar.backgroundColor = new vscode.ThemeColor("statusBarItem.errorBackground"); icon = "$(error) "; break; case "stopped": - statusBar.tooltip = "Server is stopped.\nClick to start."; - statusBar.command = "rust-analyzer.startServer"; + statusBar.tooltip.appendText("Server is stopped"); + statusBar.tooltip.appendMarkdown( + "\n\n[Start server](command:rust-analyzer.startServer)" + ); statusBar.color = undefined; statusBar.backgroundColor = undefined; statusBar.text = `$(stop-circle) rust-analyzer`; return; } + if (statusBar.tooltip.value) { + statusBar.tooltip.appendText("\n\n"); + } + statusBar.tooltip.appendMarkdown("[Stop server](command:rust-analyzer.stopServer)"); + statusBar.tooltip.appendMarkdown( + "\n\n[Reload Workspace](command:rust-analyzer.reloadWorkspace)" + ); + statusBar.tooltip.appendMarkdown("\n\n[Restart server](command:rust-analyzer.startServer)"); + statusBar.tooltip.appendMarkdown("\n\n[Open logs](command:rust-analyzer.openLogs)"); if (!status.quiescent) icon = "$(sync~spin) "; statusBar.text = `${icon}rust-analyzer`; } diff --git a/editors/code/src/lsp_ext.ts b/editors/code/src/lsp_ext.ts index f6f5124dc41..400cd207d41 100644 --- a/editors/code/src/lsp_ext.ts +++ b/editors/code/src/lsp_ext.ts @@ -59,6 +59,9 @@ export const viewFileText = new lc.RequestType<lc.TextDocumentIdentifier, string export const viewHir = new lc.RequestType<lc.TextDocumentPositionParams, string, void>( "rust-analyzer/viewHir" ); +export const viewMir = new lc.RequestType<lc.TextDocumentPositionParams, string, void>( + "rust-analyzer/viewMir" +); export const viewItemTree = new lc.RequestType<ViewItemTreeParams, string, void>( "rust-analyzer/viewItemTree" ); diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index 5987368e6e0..8a2412af849 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts @@ -158,6 +158,7 @@ function createCommands(): Record<string, CommandFactory> { parentModule: { enabled: commands.parentModule }, syntaxTree: { enabled: commands.syntaxTree }, viewHir: { enabled: commands.viewHir }, + viewMir: { enabled: commands.viewMir }, viewFileText: { enabled: commands.viewFileText }, viewItemTree: { enabled: commands.viewItemTree }, viewCrateGraph: { enabled: commands.viewCrateGraph }, @@ -187,5 +188,6 @@ function createCommands(): Record<string, CommandFactory> { runSingle: { enabled: commands.runSingle }, showReferences: { enabled: commands.showReferences }, triggerParameterHints: { enabled: commands.triggerParameterHints }, + openLogs: { enabled: commands.openLogs }, }; } diff --git a/editors/code/src/toolchain.ts b/editors/code/src/toolchain.ts index e1ca4954280..eb70b88871e 100644 --- a/editors/code/src/toolchain.ts +++ b/editors/code/src/toolchain.ts @@ -156,19 +156,10 @@ export const getPathForExecutable = memoizeAsync( if (await lookupInPath(executableName)) return executableName; - try { - // hmm, `os.homedir()` seems to be infallible - // it is not mentioned in docs and cannot be inferred by the type signature... - const standardPath = vscode.Uri.joinPath( - vscode.Uri.file(os.homedir()), - ".cargo", - "bin", - executableName - ); - + const cargoHome = getCargoHome(); + if (cargoHome) { + const standardPath = vscode.Uri.joinPath(cargoHome, "bin", executableName); if (await isFileAtUri(standardPath)) return standardPath.fsPath; - } catch (err) { - log.error("Failed to read the fs info", err); } return executableName; } @@ -190,6 +181,21 @@ async function lookupInPath(exec: string): Promise<boolean> { return false; } +function getCargoHome(): vscode.Uri | null { + const envVar = process.env["CARGO_HOME"]; + if (envVar) return vscode.Uri.file(envVar); + + try { + // hmm, `os.homedir()` seems to be infallible + // it is not mentioned in docs and cannot be inferred by the type signature... + return vscode.Uri.joinPath(vscode.Uri.file(os.homedir()), ".cargo"); + } catch (err) { + log.error("Failed to read the fs info", err); + } + + return null; +} + async function isFileAtPath(path: string): Promise<boolean> { return isFileAtUri(vscode.Uri.file(path)); } |
