mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-28 12:55:11 +00:00
internal: Keep output channels across restarts
This commit is contained in:
parent
fd298b3994
commit
1127d2508f
3 changed files with 29 additions and 7 deletions
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue