about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--editors/code/src/client.ts7
-rw-r--r--editors/code/src/ctx.ts2
-rw-r--r--editors/code/src/main.ts27
3 files changed, 29 insertions, 7 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index bff9bc30f93..8a2dea6b35b 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -7,6 +7,7 @@ import { WorkspaceEdit } from "vscode";
 import { Workspace } from "./ctx";
 import { updateConfig } from "./config";
 import { substituteVariablesInEnv } from "./config";
+import { outputChannel, traceOutputChannel } from "./main";
 import { randomUUID } from "crypto";
 
 export interface Env {
@@ -82,9 +83,6 @@ export async function createClient(
         run,
         debug: run,
     };
-    const traceOutputChannel = vscode.window.createOutputChannel(
-        "Rust Analyzer Language Server Trace"
-    );
 
     let initializationOptions = vscode.workspace.getConfiguration("rust-analyzer");
 
@@ -104,7 +102,8 @@ export async function createClient(
         documentSelector: [{ scheme: "file", language: "rust" }],
         initializationOptions,
         diagnosticCollectionName: "rustc",
-        traceOutputChannel,
+        traceOutputChannel: traceOutputChannel(),
+        outputChannel: outputChannel(),
         middleware: {
             async provideHover(
                 document: vscode.TextDocument,
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index f4f8c5b73e2..51781b4205c 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -43,8 +43,6 @@ export class Ctx {
         const res = new Ctx(config, extCtx, client, serverPath, statusBar);
 
         res.pushCleanup(client.start());
-        res.pushCleanup(client.traceOutputChannel);
-        res.pushCleanup(client.outputChannel);
         await client.onReady();
         client.onNotification(ra.serverStatus, (params) => res.setServerStatus(params));
         return res;
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 7c5be156eba..7049a2c1f69 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -15,6 +15,23 @@ let ctx: Ctx | undefined;
 
 const RUST_PROJECT_CONTEXT_NAME = "inRustProject";
 
+let TRACE_OUTPUT_CHANNEL: vscode.OutputChannel | null = null;
+export function traceOutputChannel() {
+    if (!TRACE_OUTPUT_CHANNEL) {
+        TRACE_OUTPUT_CHANNEL = vscode.window.createOutputChannel(
+            "Rust Analyzer Language Server Trace"
+        );
+    }
+    return TRACE_OUTPUT_CHANNEL;
+}
+let OUTPUT_CHANNEL: vscode.OutputChannel | null = null;
+export function outputChannel() {
+    if (!OUTPUT_CHANNEL) {
+        OUTPUT_CHANNEL = vscode.window.createOutputChannel("Rust Analyzer Language Server");
+    }
+    return OUTPUT_CHANNEL;
+}
+
 export interface RustAnalyzerExtensionApi {
     client: lc.LanguageClient;
 }
@@ -110,7 +127,7 @@ async function initCommonContext(context: vscode.ExtensionContext, ctx: Ctx) {
     // Reloading is inspired by @DanTup maneuver: https://github.com/microsoft/vscode/issues/45774#issuecomment-373423895
     ctx.registerCommand("reload", (_) => async () => {
         void vscode.window.showInformationMessage("Reloading rust-analyzer...");
-        await deactivate();
+        await doDeactivate();
         while (context.subscriptions.length > 0) {
             try {
                 context.subscriptions.pop()!.dispose();
@@ -165,6 +182,14 @@ async function initCommonContext(context: vscode.ExtensionContext, ctx: Ctx) {
 }
 
 export async function deactivate() {
+    TRACE_OUTPUT_CHANNEL?.dispose();
+    TRACE_OUTPUT_CHANNEL = null;
+    OUTPUT_CHANNEL?.dispose();
+    OUTPUT_CHANNEL = null;
+    await doDeactivate();
+}
+
+async function doDeactivate() {
     await setContextValue(RUST_PROJECT_CONTEXT_NAME, undefined);
     await ctx?.client.stop();
     ctx = undefined;