aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-03-13 13:50:35 +0000
committerGitHub <[email protected]>2021-03-13 13:50:35 +0000
commit7accf6bc37c059a83a58c82f463f02a02ed2226f (patch)
tree979c8ebe39bde9c989cb1a09f06cea4cf7cb04ac /editors
parent9674490b45a931399a9a05cd3a4c7e8fae9ec2a8 (diff)
parent49cdb2452a225dec3834e69fb011c3d7e68084f7 (diff)
Merge #7799
7799: Related tests r=matklad a=vsrs ![tests](https://user-images.githubusercontent.com/62505555/109397453-a9013680-7947-11eb-8b11-ac03079f7645.gif) This adds an ability to look for tests for the item under the cursor: function, constant, data type, etc The LSP part is bound to change. But the feature itself already works and I'm looking for a feedback :) Co-authored-by: vsrs <[email protected]>
Diffstat (limited to 'editors')
-rw-r--r--editors/code/package.json14
-rw-r--r--editors/code/src/commands.ts52
-rw-r--r--editors/code/src/lsp_ext.ts6
-rw-r--r--editors/code/src/main.ts1
4 files changed, 63 insertions, 10 deletions
diff --git a/editors/code/package.json b/editors/code/package.json
index b29f006f0..923e9b35a 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -203,6 +203,11 @@
203 "command": "rust-analyzer.openCargoToml", 203 "command": "rust-analyzer.openCargoToml",
204 "title": "Open Cargo.toml", 204 "title": "Open Cargo.toml",
205 "category": "Rust Analyzer" 205 "category": "Rust Analyzer"
206 },
207 {
208 "command": "rust-analyzer.peekTests",
209 "title": "Peek related tests",
210 "category": "Rust Analyzer"
206 } 211 }
207 ], 212 ],
208 "keybindings": [ 213 "keybindings": [
@@ -1165,7 +1170,14 @@
1165 "command": "rust-analyzer.openCargoToml", 1170 "command": "rust-analyzer.openCargoToml",
1166 "when": "inRustProject" 1171 "when": "inRustProject"
1167 } 1172 }
1173 ],
1174 "editor/context": [
1175 {
1176 "command": "rust-analyzer.peekTests",
1177 "when": "inRustProject",
1178 "group": "navigation@1000"
1179 }
1168 ] 1180 ]
1169 } 1181 }
1170 } 1182 }
1171} 1183} \ No newline at end of file
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts
index 3e96fbad8..694f445bc 100644
--- a/editors/code/src/commands.ts
+++ b/editors/code/src/commands.ts
@@ -9,6 +9,7 @@ import { RunnableQuickPick, selectRunnable, createTask, createArgs } from './run
9import { AstInspector } from './ast_inspector'; 9import { AstInspector } from './ast_inspector';
10import { isRustDocument, sleep, isRustEditor } from './util'; 10import { isRustDocument, sleep, isRustEditor } from './util';
11import { startDebugSession, makeDebugConfig } from './debug'; 11import { startDebugSession, makeDebugConfig } from './debug';
12import { LanguageClient } from 'vscode-languageclient/node';
12 13
13export * from './ast_inspector'; 14export * from './ast_inspector';
14export * from './run'; 15export * from './run';
@@ -455,17 +456,20 @@ export function reloadWorkspace(ctx: Ctx): Cmd {
455 return async () => ctx.client.sendRequest(ra.reloadWorkspace); 456 return async () => ctx.client.sendRequest(ra.reloadWorkspace);
456} 457}
457 458
459async function showReferencesImpl(client: LanguageClient, uri: string, position: lc.Position, locations: lc.Location[]) {
460 if (client) {
461 await vscode.commands.executeCommand(
462 'editor.action.showReferences',
463 vscode.Uri.parse(uri),
464 client.protocol2CodeConverter.asPosition(position),
465 locations.map(client.protocol2CodeConverter.asLocation),
466 );
467 }
468}
469
458export function showReferences(ctx: Ctx): Cmd { 470export function showReferences(ctx: Ctx): Cmd {
459 return async (uri: string, position: lc.Position, locations: lc.Location[]) => { 471 return async (uri: string, position: lc.Position, locations: lc.Location[]) => {
460 const client = ctx.client; 472 await showReferencesImpl(ctx.client, uri, position, locations);
461 if (client) {
462 await vscode.commands.executeCommand(
463 'editor.action.showReferences',
464 vscode.Uri.parse(uri),
465 client.protocol2CodeConverter.asPosition(position),
466 locations.map(client.protocol2CodeConverter.asLocation),
467 );
468 }
469 }; 473 };
470} 474}
471 475
@@ -554,6 +558,36 @@ export function run(ctx: Ctx): Cmd {
554 }; 558 };
555} 559}
556 560
561export function peekTests(ctx: Ctx): Cmd {
562 const client = ctx.client;
563
564 return async () => {
565 const editor = ctx.activeRustEditor;
566 if (!editor || !client) return;
567
568 await vscode.window.withProgress({
569 location: vscode.ProgressLocation.Notification,
570 title: "Looking for tests...",
571 cancellable: false,
572 }, async (_progress, _token) => {
573 const uri = editor.document.uri.toString();
574 const position = client.code2ProtocolConverter.asPosition(
575 editor.selection.active,
576 );
577
578 const tests = await client.sendRequest(ra.relatedTests, {
579 textDocument: { uri: uri },
580 position: position,
581 });
582 const locations: lc.Location[] = tests.map(it =>
583 lc.Location.create(it.runnable.location!.targetUri, it.runnable.location!.targetSelectionRange));
584
585 await showReferencesImpl(client, uri, position, locations);
586 });
587 };
588}
589
590
557export function runSingle(ctx: Ctx): Cmd { 591export function runSingle(ctx: Ctx): Cmd {
558 return async (runnable: ra.Runnable) => { 592 return async (runnable: ra.Runnable) => {
559 const editor = ctx.activeRustEditor; 593 const editor = ctx.activeRustEditor;
diff --git a/editors/code/src/lsp_ext.ts b/editors/code/src/lsp_ext.ts
index 2de1e427d..52de29e04 100644
--- a/editors/code/src/lsp_ext.ts
+++ b/editors/code/src/lsp_ext.ts
@@ -72,6 +72,12 @@ export interface Runnable {
72} 72}
73export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables"); 73export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables");
74 74
75export interface TestInfo {
76 runnable: Runnable;
77}
78
79export const relatedTests = new lc.RequestType<lc.TextDocumentPositionParams, TestInfo[], void>("rust-analyzer/relatedTests");
80
75export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint; 81export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint;
76 82
77export namespace InlayHint { 83export namespace InlayHint {
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 1be4f1758..925103f56 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -113,6 +113,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
113 ctx.registerCommand('newDebugConfig', commands.newDebugConfig); 113 ctx.registerCommand('newDebugConfig', commands.newDebugConfig);
114 ctx.registerCommand('openDocs', commands.openDocs); 114 ctx.registerCommand('openDocs', commands.openDocs);
115 ctx.registerCommand('openCargoToml', commands.openCargoToml); 115 ctx.registerCommand('openCargoToml', commands.openCargoToml);
116 ctx.registerCommand('peekTests', commands.peekTests);
116 117
117 defaultOnEnter.dispose(); 118 defaultOnEnter.dispose();
118 ctx.registerCommand('onEnter', commands.onEnter); 119 ctx.registerCommand('onEnter', commands.onEnter);