diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-13 13:50:35 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-13 13:50:35 +0000 |
commit | 7accf6bc37c059a83a58c82f463f02a02ed2226f (patch) | |
tree | 979c8ebe39bde9c989cb1a09f06cea4cf7cb04ac /editors | |
parent | 9674490b45a931399a9a05cd3a4c7e8fae9ec2a8 (diff) | |
parent | 49cdb2452a225dec3834e69fb011c3d7e68084f7 (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.json | 14 | ||||
-rw-r--r-- | editors/code/src/commands.ts | 52 | ||||
-rw-r--r-- | editors/code/src/lsp_ext.ts | 6 | ||||
-rw-r--r-- | editors/code/src/main.ts | 1 |
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 | |||
9 | import { AstInspector } from './ast_inspector'; | 9 | import { AstInspector } from './ast_inspector'; |
10 | import { isRustDocument, sleep, isRustEditor } from './util'; | 10 | import { isRustDocument, sleep, isRustEditor } from './util'; |
11 | import { startDebugSession, makeDebugConfig } from './debug'; | 11 | import { startDebugSession, makeDebugConfig } from './debug'; |
12 | import { LanguageClient } from 'vscode-languageclient/node'; | ||
12 | 13 | ||
13 | export * from './ast_inspector'; | 14 | export * from './ast_inspector'; |
14 | export * from './run'; | 15 | export * 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 | ||
459 | async 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 | |||
458 | export function showReferences(ctx: Ctx): Cmd { | 470 | export 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 | ||
561 | export 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 | |||
557 | export function runSingle(ctx: Ctx): Cmd { | 591 | export 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 | } |
73 | export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables"); | 73 | export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables"); |
74 | 74 | ||
75 | export interface TestInfo { | ||
76 | runnable: Runnable; | ||
77 | } | ||
78 | |||
79 | export const relatedTests = new lc.RequestType<lc.TextDocumentPositionParams, TestInfo[], void>("rust-analyzer/relatedTests"); | ||
80 | |||
75 | export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint; | 81 | export type InlayHint = InlayHint.TypeHint | InlayHint.ParamHint | InlayHint.ChainingHint; |
76 | 82 | ||
77 | export namespace InlayHint { | 83 | export 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); |