aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/code/src/commands/index.ts2
-rw-r--r--editors/code/src/commands/matching_brace.ts53
-rw-r--r--editors/code/src/ctx.ts7
-rw-r--r--editors/code/src/main.ts5
4 files changed, 35 insertions, 32 deletions
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index ed56f5a4e..9d9b9c575 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -1,11 +1,11 @@
1import { Ctx, Cmd } from '../ctx' 1import { Ctx, Cmd } from '../ctx'
2 2
3import { analyzerStatus } from './analyzer_status'; 3import { analyzerStatus } from './analyzer_status';
4import { matchingBrace } from './matching_brace';
4import * as applySourceChange from './apply_source_change'; 5import * as applySourceChange from './apply_source_change';
5import * as expandMacro from './expand_macro'; 6import * as expandMacro from './expand_macro';
6import * as inlayHints from './inlay_hints'; 7import * as inlayHints from './inlay_hints';
7import * as joinLines from './join_lines'; 8import * as joinLines from './join_lines';
8import * as matchingBrace from './matching_brace';
9import * as onEnter from './on_enter'; 9import * as onEnter from './on_enter';
10import * as parentModule from './parent_module'; 10import * as parentModule from './parent_module';
11import * as runnables from './runnables'; 11import * as runnables from './runnables';
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}
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index 87f1574d3..712337fe7 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -13,6 +13,13 @@ export class Ctx {
13 return Server.client; 13 return Server.client;
14 } 14 }
15 15
16 get activeRustEditor(): vscode.TextEditor | undefined {
17 const editor = vscode.window.activeTextEditor;
18 return editor && editor.document.languageId === 'rust'
19 ? editor
20 : undefined;
21 }
22
16 registerCommand(name: string, factory: (ctx: Ctx) => Cmd) { 23 registerCommand(name: string, factory: (ctx: Ctx) => Cmd) {
17 const fullName = `rust-analyzer.${name}`; 24 const fullName = `rust-analyzer.${name}`;
18 const cmd = factory(this); 25 const cmd = factory(this);
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index f96fb1962..a4149a059 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -17,6 +17,7 @@ export async function activate(context: vscode.ExtensionContext) {
17 ctx = new Ctx(context); 17 ctx = new Ctx(context);
18 ctx.registerCommand('analyzerStatus', commands.analyzerStatus); 18 ctx.registerCommand('analyzerStatus', commands.analyzerStatus);
19 ctx.registerCommand('collectGarbage', commands.collectGarbage); 19 ctx.registerCommand('collectGarbage', commands.collectGarbage);
20 ctx.registerCommand('matchingBrace', commands.matchingBrace);
20 21
21 function disposeOnDeactivation(disposable: vscode.Disposable) { 22 function disposeOnDeactivation(disposable: vscode.Disposable) {
22 context.subscriptions.push(disposable); 23 context.subscriptions.push(disposable);
@@ -55,10 +56,6 @@ export async function activate(context: vscode.ExtensionContext) {
55 } 56 }
56 57
57 // Commands are requests from vscode to the language server 58 // Commands are requests from vscode to the language server
58 registerCommand(
59 'rust-analyzer.matchingBrace',
60 commands.matchingBrace.handle,
61 );
62 registerCommand('rust-analyzer.joinLines', commands.joinLines.handle); 59 registerCommand('rust-analyzer.joinLines', commands.joinLines.handle);
63 registerCommand('rust-analyzer.parentModule', commands.parentModule.handle); 60 registerCommand('rust-analyzer.parentModule', commands.parentModule.handle);
64 registerCommand('rust-analyzer.run', commands.runnables.handle); 61 registerCommand('rust-analyzer.run', commands.runnables.handle);