aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/commands
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/commands')
-rw-r--r--editors/code/src/commands/analyzer_status.ts19
-rw-r--r--editors/code/src/commands/index.ts11
-rw-r--r--editors/code/src/commands/matching_brace.ts53
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 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import { Server } from '../server'; 2import { Ctx, Cmd } from '../ctx';
3// Shows status of rust-analyzer (for debugging) 3// Shows status of rust-analyzer (for debugging)
4 4
5export function makeCommand(context: vscode.ExtensionContext) { 5export 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
40class TextDocumentContentProvider 40class 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 @@
1import * as analyzerStatus from './analyzer_status'; 1import { Ctx, Cmd } from '../ctx'
2
3import { analyzerStatus } from './analyzer_status';
4import { matchingBrace } from './matching_brace';
2import * as applySourceChange from './apply_source_change'; 5import * as applySourceChange from './apply_source_change';
3import * as expandMacro from './expand_macro'; 6import * as expandMacro from './expand_macro';
4import * as inlayHints from './inlay_hints'; 7import * as inlayHints from './inlay_hints';
5import * as joinLines from './join_lines'; 8import * as joinLines from './join_lines';
6import * as matchingBrace from './matching_brace';
7import * as onEnter from './on_enter'; 9import * as onEnter from './on_enter';
8import * as parentModule from './parent_module'; 10import * as parentModule from './parent_module';
9import * as runnables from './runnables'; 11import * as runnables from './runnables';
10import * as syntaxTree from './syntaxTree'; 12import * as syntaxTree from './syntaxTree';
11 13
14function collectGarbage(ctx: Ctx): Cmd {
15 return async () => { ctx.client.sendRequest<null>('rust-analyzer/collectGarbage', null) }
16}
17
12export { 18export {
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 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2
3import { Position, TextDocumentIdentifier } from 'vscode-languageclient'; 2import { Position, TextDocumentIdentifier } from 'vscode-languageclient';
4import { Server } from '../server'; 3import { Ctx, Cmd } from '../ctx';
4
5export 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
6interface FindMatchingBraceParams { 30interface FindMatchingBraceParams {
7 textDocument: TextDocumentIdentifier; 31 textDocument: TextDocumentIdentifier;
8 offsets: Position[]; 32 offsets: Position[];
9} 33}
10
11export 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}