internal: Keep output channels across restarts

This commit is contained in:
Lukas Wirth 2022-06-05 13:59:49 +02:00
parent fd298b3994
commit 1127d2508f
3 changed files with 29 additions and 7 deletions

View file

@ -7,6 +7,7 @@ import { WorkspaceEdit } from "vscode";
import { Workspace } from "./ctx"; import { Workspace } from "./ctx";
import { updateConfig } from "./config"; import { updateConfig } from "./config";
import { substituteVariablesInEnv } from "./config"; import { substituteVariablesInEnv } from "./config";
import { outputChannel, traceOutputChannel } from "./main";
import { randomUUID } from "crypto"; import { randomUUID } from "crypto";
export interface Env { export interface Env {
@ -82,9 +83,6 @@ export async function createClient(
run, run,
debug: run, debug: run,
}; };
const traceOutputChannel = vscode.window.createOutputChannel(
"Rust Analyzer Language Server Trace"
);
let initializationOptions = vscode.workspace.getConfiguration("rust-analyzer"); let initializationOptions = vscode.workspace.getConfiguration("rust-analyzer");
@ -104,7 +102,8 @@ export async function createClient(
documentSelector: [{ scheme: "file", language: "rust" }], documentSelector: [{ scheme: "file", language: "rust" }],
initializationOptions, initializationOptions,
diagnosticCollectionName: "rustc", diagnosticCollectionName: "rustc",
traceOutputChannel, traceOutputChannel: traceOutputChannel(),
outputChannel: outputChannel(),
middleware: { middleware: {
async provideHover( async provideHover(
document: vscode.TextDocument, document: vscode.TextDocument,

View file

@ -43,8 +43,6 @@ export class Ctx {
const res = new Ctx(config, extCtx, client, serverPath, statusBar); const res = new Ctx(config, extCtx, client, serverPath, statusBar);
res.pushCleanup(client.start()); res.pushCleanup(client.start());
res.pushCleanup(client.traceOutputChannel);
res.pushCleanup(client.outputChannel);
await client.onReady(); await client.onReady();
client.onNotification(ra.serverStatus, (params) => res.setServerStatus(params)); client.onNotification(ra.serverStatus, (params) => res.setServerStatus(params));
return res; return res;

View file

@ -15,6 +15,23 @@ let ctx: Ctx | undefined;
const RUST_PROJECT_CONTEXT_NAME = "inRustProject"; 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 { export interface RustAnalyzerExtensionApi {
client: lc.LanguageClient; 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 // Reloading is inspired by @DanTup maneuver: https://github.com/microsoft/vscode/issues/45774#issuecomment-373423895
ctx.registerCommand("reload", (_) => async () => { ctx.registerCommand("reload", (_) => async () => {
void vscode.window.showInformationMessage("Reloading rust-analyzer..."); void vscode.window.showInformationMessage("Reloading rust-analyzer...");
await deactivate(); await doDeactivate();
while (context.subscriptions.length > 0) { while (context.subscriptions.length > 0) {
try { try {
context.subscriptions.pop()!.dispose(); context.subscriptions.pop()!.dispose();
@ -165,6 +182,14 @@ async function initCommonContext(context: vscode.ExtensionContext, ctx: Ctx) {
} }
export async function deactivate() { 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 setContextValue(RUST_PROJECT_CONTEXT_NAME, undefined);
await ctx?.client.stop(); await ctx?.client.stop();
ctx = undefined; ctx = undefined;