Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Add config and capability for test explorer #16773

Merged
merged 1 commit into from
Mar 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix: Add config and capability for test explorer
  • Loading branch information
Veykril committed Mar 6, 2024
commit 1c6d1b4f2a812e2c3874a2ca93016ece25c3bf76
4 changes: 4 additions & 0 deletions crates/rust-analyzer/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1146,6 +1146,10 @@ impl Config {
self.experimental("colorDiagnosticOutput")
}

pub fn test_explorer(&self) -> bool {
self.experimental("testExplorer")
}

pub fn publish_diagnostics(&self) -> bool {
self.data.diagnostics_enable
}
Expand Down
7 changes: 4 additions & 3 deletions crates/rust-analyzer/src/main_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -386,10 +386,11 @@ impl GlobalState {
}
}

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();
}
}
Expand Down
5 changes: 5 additions & 0 deletions docs/dev/lsp-extensions.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
5 changes: 5 additions & 0 deletions editors/code/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
Expand Down
8 changes: 7 additions & 1 deletion editors/code/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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" };
}
Expand All @@ -391,6 +396,7 @@ class ExperimentalFeatures implements lc.StaticFeature {
colorDiagnosticOutput: true,
openServerLogs: true,
localDocs: true,
testExplorer: this.testExplorer,
commands: {
commands: [
"rust-analyzer.runSingle",
Expand Down
4 changes: 4 additions & 0 deletions editors/code/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,10 @@ export class Config {
return this.get<string | undefined>("cargoRunner");
}

get testExplorer() {
return this.get<boolean | undefined>("testExplorer");
}

get runnablesExtraEnv() {
const item = this.get<any>("runnables.extraEnv") ?? this.get<any>("runnableEnv");
if (!item) return item;
Expand Down
20 changes: 12 additions & 8 deletions editors/code/src/ctx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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({
Expand All @@ -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());
}
Expand Down Expand Up @@ -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);
}
Expand Down
Loading