diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 9f50da4dc88..9e81c8dd665 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -1146,6 +1146,10 @@ pub fn color_diagnostic_output(&self) -> bool { self.experimental("colorDiagnosticOutput") } + pub fn test_explorer(&self) -> bool { + self.experimental("testExplorer") + } + pub fn publish_diagnostics(&self) -> bool { self.data.diagnostics_enable } diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 87da95c87e3..99c00d0384a 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -386,10 +386,11 @@ fn handle_event(&mut self, event: Event) -> anyhow::Result<()> { } } - let update_diagnostics = (!was_quiescent || state_changed || memdocs_added_or_removed) - && self.config.publish_diagnostics(); - if update_diagnostics { + let things_changed = !was_quiescent || state_changed || memdocs_added_or_removed; + if things_changed && self.config.publish_diagnostics() { self.update_diagnostics(); + } + if things_changed && self.config.test_explorer() { self.update_tests(); } } diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md index 8d523d7baa3..17e2eb5da5c 100644 --- a/docs/dev/lsp-extensions.md +++ b/docs/dev/lsp-extensions.md @@ -387,6 +387,11 @@ rust-analyzer supports only one `kind`, `"cargo"`. The `args` for `"cargo"` look ## Test explorer +**Experimental Client Capability:** `{ "testExplorer": boolean }` + +If this capability is set, the `experimental/discoveredTests` notification will be sent from the +server to the client. + **Method:** `experimental/discoverTest` **Request:** `DiscoverTestParams` diff --git a/editors/code/package.json b/editors/code/package.json index 16d3dcbab6f..c34b8e25de0 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -510,6 +510,11 @@ "default": true, "type": "boolean" }, + "rust-analyzer.testExplorer": { + "markdownDescription": "Whether to show the test explorer.", + "default": false, + "type": "boolean" + }, "$generated-start": {}, "rust-analyzer.assist.emitMustUse": { "markdownDescription": "Whether to insert #[must_use] when generating `as_` methods\nfor enum variants.", diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index c27a446b380..1cbf247297f 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts @@ -372,13 +372,18 @@ export async function createClient( ); // To turn on all proposed features use: client.registerProposedFeatures(); - client.registerFeature(new ExperimentalFeatures()); + client.registerFeature(new ExperimentalFeatures(config)); client.registerFeature(new OverrideFeatures()); return client; } class ExperimentalFeatures implements lc.StaticFeature { + private readonly testExplorer: boolean; + + constructor(config: Config) { + this.testExplorer = config.testExplorer || false; + } getState(): lc.FeatureState { return { kind: "static" }; } @@ -391,6 +396,7 @@ class ExperimentalFeatures implements lc.StaticFeature { colorDiagnosticOutput: true, openServerLogs: true, localDocs: true, + testExplorer: this.testExplorer, commands: { commands: [ "rust-analyzer.runSingle", diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index 51a0aece820..92a816bfbcb 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -266,6 +266,10 @@ export class Config { return this.get("cargoRunner"); } + get testExplorer() { + return this.get("testExplorer"); + } + get runnablesExtraEnv() { const item = this.get("runnables.extraEnv") ?? this.get("runnableEnv"); if (!item) return item; diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index 9be846f9692..f76dec2629a 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts @@ -75,7 +75,7 @@ export class Ctx implements RustAnalyzerExtensionApi { private _client: lc.LanguageClient | undefined; private _serverPath: string | undefined; private traceOutputChannel: vscode.OutputChannel | undefined; - private testController: vscode.TestController; + private testController: vscode.TestController | undefined; private outputChannel: vscode.OutputChannel | undefined; private clientSubscriptions: Disposable[]; private state: PersistentState; @@ -104,18 +104,20 @@ export class Ctx implements RustAnalyzerExtensionApi { workspace: Workspace, ) { extCtx.subscriptions.push(this); + this.config = new Config(extCtx); this.statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left); - this.testController = vscode.tests.createTestController( - "rustAnalyzerTestController", - "Rust Analyzer test controller", - ); + if (this.config.testExplorer) { + this.testController = vscode.tests.createTestController( + "rustAnalyzerTestController", + "Rust Analyzer test controller", + ); + } this.workspace = workspace; this.clientSubscriptions = []; this.commandDisposables = []; this.commandFactories = commandFactories; this.unlinkedFiles = []; this.state = new PersistentState(extCtx.globalState); - this.config = new Config(extCtx); this.updateCommands("disable"); this.setServerStatus({ @@ -126,7 +128,7 @@ export class Ctx implements RustAnalyzerExtensionApi { dispose() { this.config.dispose(); this.statusBar.dispose(); - this.testController.dispose(); + this.testController?.dispose(); void this.disposeClient(); this.commandDisposables.forEach((disposable) => disposable.dispose()); } @@ -271,7 +273,9 @@ export class Ctx implements RustAnalyzerExtensionApi { await client.start(); this.updateCommands(); - prepareTestExplorer(this, this.testController, client); + if (this.testController) { + prepareTestExplorer(this, this.testController, client); + } if (this.config.showDependenciesExplorer) { this.prepareTreeDependenciesView(client); }