From 1127d2508f883811c118d1575497c8199dca9ea2 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 5 Jun 2022 13:59:49 +0200 Subject: [PATCH] internal: Keep output channels across restarts --- editors/code/src/client.ts | 7 +++---- editors/code/src/ctx.ts | 2 -- editors/code/src/main.ts | 27 ++++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index bff9bc30f938..8a2dea6b35b7 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 f4f8c5b73e2b..51781b4205cd 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 7c5be156eba9..7049a2c1f69a 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;