diff options
Diffstat (limited to 'editors/code/src/commands')
-rw-r--r-- | editors/code/src/commands/analyzer_status.ts | 19 | ||||
-rw-r--r-- | editors/code/src/commands/index.ts | 11 | ||||
-rw-r--r-- | editors/code/src/commands/matching_brace.ts | 53 |
3 files changed, 48 insertions, 35 deletions
diff --git a/editors/code/src/commands/analyzer_status.ts b/editors/code/src/commands/analyzer_status.ts index 5840e8fc0..c9d32fe07 100644 --- a/editors/code/src/commands/analyzer_status.ts +++ b/editors/code/src/commands/analyzer_status.ts | |||
@@ -1,19 +1,19 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import { Server } from '../server'; | 2 | import { Ctx, Cmd } from '../ctx'; |
3 | // Shows status of rust-analyzer (for debugging) | 3 | // Shows status of rust-analyzer (for debugging) |
4 | 4 | ||
5 | export function makeCommand(context: vscode.ExtensionContext) { | 5 | export function analyzerStatus(ctx: Ctx): Cmd { |
6 | let poller: NodeJS.Timer | null = null; | 6 | let poller: NodeJS.Timer | null = null; |
7 | const tdcp = new TextDocumentContentProvider(); | 7 | const tdcp = new TextDocumentContentProvider(ctx); |
8 | 8 | ||
9 | context.subscriptions.push( | 9 | ctx.pushCleanup( |
10 | vscode.workspace.registerTextDocumentContentProvider( | 10 | vscode.workspace.registerTextDocumentContentProvider( |
11 | 'rust-analyzer-status', | 11 | 'rust-analyzer-status', |
12 | tdcp, | 12 | tdcp, |
13 | ), | 13 | ), |
14 | ); | 14 | ); |
15 | 15 | ||
16 | context.subscriptions.push({ | 16 | ctx.pushCleanup({ |
17 | dispose() { | 17 | dispose() { |
18 | if (poller != null) { | 18 | if (poller != null) { |
19 | clearInterval(poller); | 19 | clearInterval(poller); |
@@ -39,9 +39,16 @@ export function makeCommand(context: vscode.ExtensionContext) { | |||
39 | 39 | ||
40 | class TextDocumentContentProvider | 40 | class TextDocumentContentProvider |
41 | implements vscode.TextDocumentContentProvider { | 41 | implements vscode.TextDocumentContentProvider { |
42 | |||
42 | uri = vscode.Uri.parse('rust-analyzer-status://status'); | 43 | uri = vscode.Uri.parse('rust-analyzer-status://status'); |
43 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); | 44 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); |
44 | 45 | ||
46 | ctx: Ctx | ||
47 | |||
48 | constructor(ctx: Ctx) { | ||
49 | this.ctx = ctx | ||
50 | } | ||
51 | |||
45 | provideTextDocumentContent( | 52 | provideTextDocumentContent( |
46 | _uri: vscode.Uri, | 53 | _uri: vscode.Uri, |
47 | ): vscode.ProviderResult<string> { | 54 | ): vscode.ProviderResult<string> { |
@@ -49,7 +56,7 @@ class TextDocumentContentProvider | |||
49 | if (editor == null) { | 56 | if (editor == null) { |
50 | return ''; | 57 | return ''; |
51 | } | 58 | } |
52 | return Server.client.sendRequest<string>( | 59 | return this.ctx.client.sendRequest<string>( |
53 | 'rust-analyzer/analyzerStatus', | 60 | 'rust-analyzer/analyzerStatus', |
54 | null, | 61 | null, |
55 | ); | 62 | ); |
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts index 13a696758..9d9b9c575 100644 --- a/editors/code/src/commands/index.ts +++ b/editors/code/src/commands/index.ts | |||
@@ -1,14 +1,20 @@ | |||
1 | import * as analyzerStatus from './analyzer_status'; | 1 | import { Ctx, Cmd } from '../ctx' |
2 | |||
3 | import { analyzerStatus } from './analyzer_status'; | ||
4 | import { matchingBrace } from './matching_brace'; | ||
2 | import * as applySourceChange from './apply_source_change'; | 5 | import * as applySourceChange from './apply_source_change'; |
3 | import * as expandMacro from './expand_macro'; | 6 | import * as expandMacro from './expand_macro'; |
4 | import * as inlayHints from './inlay_hints'; | 7 | import * as inlayHints from './inlay_hints'; |
5 | import * as joinLines from './join_lines'; | 8 | import * as joinLines from './join_lines'; |
6 | import * as matchingBrace from './matching_brace'; | ||
7 | import * as onEnter from './on_enter'; | 9 | import * as onEnter from './on_enter'; |
8 | import * as parentModule from './parent_module'; | 10 | import * as parentModule from './parent_module'; |
9 | import * as runnables from './runnables'; | 11 | import * as runnables from './runnables'; |
10 | import * as syntaxTree from './syntaxTree'; | 12 | import * as syntaxTree from './syntaxTree'; |
11 | 13 | ||
14 | function collectGarbage(ctx: Ctx): Cmd { | ||
15 | return async () => { ctx.client.sendRequest<null>('rust-analyzer/collectGarbage', null) } | ||
16 | } | ||
17 | |||
12 | export { | 18 | export { |
13 | analyzerStatus, | 19 | analyzerStatus, |
14 | applySourceChange, | 20 | applySourceChange, |
@@ -20,4 +26,5 @@ export { | |||
20 | syntaxTree, | 26 | syntaxTree, |
21 | onEnter, | 27 | onEnter, |
22 | inlayHints, | 28 | inlayHints, |
29 | collectGarbage | ||
23 | }; | 30 | }; |
diff --git a/editors/code/src/commands/matching_brace.ts b/editors/code/src/commands/matching_brace.ts index 364208cc7..665b0c33c 100644 --- a/editors/code/src/commands/matching_brace.ts +++ b/editors/code/src/commands/matching_brace.ts | |||
@@ -1,34 +1,33 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | |||
3 | import { Position, TextDocumentIdentifier } from 'vscode-languageclient'; | 2 | import { Position, TextDocumentIdentifier } from 'vscode-languageclient'; |
4 | import { Server } from '../server'; | 3 | import { Ctx, Cmd } from '../ctx'; |
4 | |||
5 | export function matchingBrace(ctx: Ctx): Cmd { | ||
6 | return async () => { | ||
7 | const editor = ctx.activeRustEditor; | ||
8 | if (!editor) { | ||
9 | return; | ||
10 | } | ||
11 | const request: FindMatchingBraceParams = { | ||
12 | textDocument: { uri: editor.document.uri.toString() }, | ||
13 | offsets: editor.selections.map(s => ctx.client.code2ProtocolConverter.asPosition(s.active)), | ||
14 | }; | ||
15 | const response = await ctx.client.sendRequest<Position[]>( | ||
16 | 'rust-analyzer/findMatchingBrace', | ||
17 | request, | ||
18 | ); | ||
19 | editor.selections = editor.selections.map((sel, idx) => { | ||
20 | const active = ctx.client.protocol2CodeConverter.asPosition( | ||
21 | response[idx], | ||
22 | ); | ||
23 | const anchor = sel.isEmpty ? active : sel.anchor; | ||
24 | return new vscode.Selection(anchor, active); | ||
25 | }); | ||
26 | editor.revealRange(editor.selection); | ||
27 | } | ||
28 | } | ||
5 | 29 | ||
6 | interface FindMatchingBraceParams { | 30 | interface FindMatchingBraceParams { |
7 | textDocument: TextDocumentIdentifier; | 31 | textDocument: TextDocumentIdentifier; |
8 | offsets: Position[]; | 32 | offsets: Position[]; |
9 | } | 33 | } |
10 | |||
11 | export async function handle() { | ||
12 | const editor = vscode.window.activeTextEditor; | ||
13 | if (editor == null || editor.document.languageId !== 'rust') { | ||
14 | return; | ||
15 | } | ||
16 | const request: FindMatchingBraceParams = { | ||
17 | textDocument: { uri: editor.document.uri.toString() }, | ||
18 | offsets: editor.selections.map(s => { | ||
19 | return Server.client.code2ProtocolConverter.asPosition(s.active); | ||
20 | }), | ||
21 | }; | ||
22 | const response = await Server.client.sendRequest<Position[]>( | ||
23 | 'rust-analyzer/findMatchingBrace', | ||
24 | request, | ||
25 | ); | ||
26 | editor.selections = editor.selections.map((sel, idx) => { | ||
27 | const active = Server.client.protocol2CodeConverter.asPosition( | ||
28 | response[idx], | ||
29 | ); | ||
30 | const anchor = sel.isEmpty ? active : sel.anchor; | ||
31 | return new vscode.Selection(anchor, active); | ||
32 | }); | ||
33 | editor.revealRange(editor.selection); | ||
34 | } | ||