Unnamed repository; edit this file 'description' to name the repository.
fix: Make RustAnalyzer:Run available in manifest file
Ali Bektas 2025-03-06
parent d426cbe · commit 4c74900
-rw-r--r--editors/code/src/ctx.ts6
-rw-r--r--editors/code/src/run.ts19
-rw-r--r--editors/code/src/util.ts4
3 files changed, 23 insertions, 6 deletions
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index ac73f2ae6b..37a2ee2369 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -5,6 +5,7 @@ import * as ra from "./lsp_ext";
import { Config, prepareVSCodeConfig } from "./config";
import { createClient } from "./client";
import {
+ isCargoTomlEditor,
isDocumentInWorkspace,
isRustDocument,
isRustEditor,
@@ -429,6 +430,11 @@ export class Ctx implements RustAnalyzerExtensionApi {
return editor && isRustEditor(editor) ? editor : undefined;
}
+ get activeCargoTomlEditor(): RustEditor | undefined {
+ const editor = vscode.window.activeTextEditor;
+ return editor && isCargoTomlEditor(editor) ? editor : undefined;
+ }
+
get extensionPath(): string {
return this.extCtx.extensionPath;
}
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts
index f71ab7ffbd..40027cc7c8 100644
--- a/editors/code/src/run.ts
+++ b/editors/code/src/run.ts
@@ -7,7 +7,7 @@ import type { CtxInit } from "./ctx";
import { makeDebugConfig } from "./debug";
import type { Config } from "./config";
import type { LanguageClient } from "vscode-languageclient/node";
-import { unwrapUndefinable, type RustEditor } from "./util";
+import { log, unwrapUndefinable, type RustEditor } from "./util";
const quickPickButtons = [
{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configuration." },
@@ -19,7 +19,7 @@ export async function selectRunnable(
debuggeeOnly = false,
showButtons: boolean = true,
): Promise<RunnableQuickPick | undefined> {
- const editor = ctx.activeRustEditor;
+ const editor = ctx.activeRustEditor ?? ctx.activeCargoTomlEditor;
if (!editor) return;
// show a placeholder while we get the runnables from the server
@@ -175,10 +175,17 @@ async function getRunnables(
uri: editor.document.uri.toString(),
};
- const runnables = await client.sendRequest(ra.runnables, {
- textDocument,
- position: client.code2ProtocolConverter.asPosition(editor.selection.active),
- });
+ const runnables = await client
+ .sendRequest(ra.runnables, {
+ textDocument,
+ position: client.code2ProtocolConverter.asPosition(editor.selection.active),
+ })
+ .catch((err) => {
+ // If this command is run for a virtual manifest at the workspace root, then this request
+ // will fail as we do not watch this file.
+ log.error(`${err}`);
+ return [];
+ });
const items: RunnableQuickPick[] = [];
if (prevRunnable) {
items.push(prevRunnable);
diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts
index 2f7702baeb..93c7bf8d73 100644
--- a/editors/code/src/util.ts
+++ b/editors/code/src/util.ts
@@ -90,6 +90,10 @@ export function isRustEditor(editor: vscode.TextEditor): editor is RustEditor {
return isRustDocument(editor.document);
}
+export function isCargoTomlEditor(editor: vscode.TextEditor): editor is RustEditor {
+ return isCargoTomlDocument(editor.document);
+}
+
export function isDocumentInWorkspace(document: RustDocument): boolean {
const workspaceFolders = vscode.workspace.workspaceFolders;
if (!workspaceFolders) {