Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--editors/code/src/ast_inspector.ts2
-rw-r--r--editors/code/src/commands.ts3
-rw-r--r--editors/code/src/ctx.ts35
-rw-r--r--editors/code/src/main.ts10
-rw-r--r--editors/code/src/run.ts4
5 files changed, 31 insertions, 23 deletions
diff --git a/editors/code/src/ast_inspector.ts b/editors/code/src/ast_inspector.ts
index 2a2c9326b6..176040120f 100644
--- a/editors/code/src/ast_inspector.ts
+++ b/editors/code/src/ast_inspector.ts
@@ -54,8 +54,6 @@ export class AstInspector implements vscode.HoverProvider, vscode.DefinitionProv
this,
ctx.subscriptions
);
-
- ctx.pushExtCleanup(this);
}
dispose() {
this.setRustEditor(undefined);
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts
index cb088fc6c6..12ceb4f2df 100644
--- a/editors/code/src/commands.ts
+++ b/editors/code/src/commands.ts
@@ -377,8 +377,7 @@ export function syntaxTree(ctx: Ctx): Cmd {
}
})();
- void new AstInspector(ctx);
-
+ ctx.pushExtCleanup(new AstInspector(ctx));
ctx.pushExtCleanup(
vscode.workspace.registerTextDocumentContentProvider("rust-analyzer-syntax-tree", tdcp)
);
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index f62ccd1a65..6b12d9ca1e 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -23,12 +23,12 @@ export class Ctx {
readonly config: Config;
private client: lc.LanguageClient | undefined;
+ private _serverPath: string | undefined;
+ private traceOutputChannel: vscode.OutputChannel | undefined;
+ private outputChannel: vscode.OutputChannel | undefined;
+ private state: PersistentState;
- traceOutputChannel: vscode.OutputChannel | undefined;
- outputChannel: vscode.OutputChannel | undefined;
workspace: Workspace;
- state: PersistentState;
- serverPath: string | undefined;
constructor(readonly extCtx: vscode.ExtensionContext, workspace: Workspace) {
this.statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
@@ -70,21 +70,24 @@ export class Ctx {
if (!this.client) {
log.info("Creating language client");
- this.serverPath = await bootstrap(this.extCtx, this.config, this.state).catch((err) => {
- let message = "bootstrap error. ";
+ this._serverPath = await bootstrap(this.extCtx, this.config, this.state).catch(
+ (err) => {
+ let message = "bootstrap error. ";
- message +=
- 'See the logs in "OUTPUT > Rust Analyzer Client" (should open automatically). ';
- message += 'To enable verbose logs use { "rust-analyzer.trace.extension": true }';
+ message +=
+ 'See the logs in "OUTPUT > Rust Analyzer Client" (should open automatically). ';
+ message +=
+ 'To enable verbose logs use { "rust-analyzer.trace.extension": true }';
- log.error("Bootstrap error", err);
- throw new Error(message);
- });
+ log.error("Bootstrap error", err);
+ throw new Error(message);
+ }
+ );
const newEnv = substituteVariablesInEnv(
Object.assign({}, process.env, this.config.serverExtraEnv)
);
const run: lc.Executable = {
- command: this.serverPath,
+ command: this._serverPath,
options: { env: newEnv },
};
const serverOptions = {
@@ -129,7 +132,7 @@ export class Ctx {
async disposeClient() {
log.info("Deactivating language client");
await this.client?.dispose();
- this.serverPath = undefined;
+ this._serverPath = undefined;
this.client = undefined;
}
@@ -161,6 +164,10 @@ export class Ctx {
return this.extCtx.subscriptions;
}
+ get serverPath(): string | undefined {
+ return this._serverPath;
+ }
+
setServerStatus(status: ServerStatusParams) {
let icon = "";
const statusBar = this.statusBar;
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 84f0a5810f..97ec41dce3 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -14,6 +14,10 @@ export interface RustAnalyzerExtensionApi {
readonly client?: lc.LanguageClient;
}
+export async function deactivate() {
+ await setContextValue(RUST_PROJECT_CONTEXT_NAME, undefined);
+}
+
export async function activate(
context: vscode.ExtensionContext
): Promise<RustAnalyzerExtensionApi> {
@@ -56,12 +60,14 @@ export async function activate(
const ctx = new Ctx(context, workspace);
// VS Code doesn't show a notification when an extension fails to activate
// so we do it ourselves.
- return await activateServer(ctx).catch((err) => {
+ const api = await activateServer(ctx).catch((err) => {
void vscode.window.showErrorMessage(
`Cannot activate rust-analyzer extension: ${err.message}`
);
throw err;
});
+ await setContextValue(RUST_PROJECT_CONTEXT_NAME, true);
+ return api;
}
async function activateServer(ctx: Ctx): Promise<RustAnalyzerExtensionApi> {
@@ -112,8 +118,6 @@ async function initCommonContext(ctx: Ctx) {
);
ctx.pushExtCleanup(defaultOnEnter);
- await setContextValue(RUST_PROJECT_CONTEXT_NAME, true);
-
// Commands which invokes manually via command palette, shortcut, etc.
ctx.registerCommand("reload", (_) => async () => {
void vscode.window.showInformationMessage("Reloading rust-analyzer...");
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts
index 22e5eda682..dadaa41b1d 100644
--- a/editors/code/src/run.ts
+++ b/editors/code/src/run.ts
@@ -18,9 +18,9 @@ export async function selectRunnable(
showButtons: boolean = true
): Promise<RunnableQuickPick | undefined> {
const editor = ctx.activeRustEditor;
- const client = ctx.client;
- if (!editor || !client) return;
+ if (!editor) return;
+ const client = await ctx.getClient();
const textDocument: lc.TextDocumentIdentifier = {
uri: editor.document.uri.toString(),
};