Auto merge of #16773 - Veykril:text-explorer, r=Veykril

fix: Add config and capability for test explorer
This commit is contained in:
bors 2024-03-06 18:26:40 +00:00
commit ce15e73a8e
7 changed files with 41 additions and 12 deletions

View File

@ -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
}

View File

@ -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();
}
}

View File

@ -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`

View File

@ -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.",

View File

@ -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",

View File

@ -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;

View File

@ -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);
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();
if (this.testController) {
prepareTestExplorer(this, this.testController, client);
}
if (this.config.showDependenciesExplorer) {
this.prepareTreeDependenciesView(client);
}