aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src')
-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
-rw-r--r--editors/code/src/ctx.ts35
-rw-r--r--editors/code/src/main.ts19
5 files changed, 91 insertions, 46 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}
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
new file mode 100644
index 000000000..712337fe7
--- /dev/null
+++ b/editors/code/src/ctx.ts
@@ -0,0 +1,35 @@
1import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient';
3import { Server } from './server';
4
5export class Ctx {
6 private extCtx: vscode.ExtensionContext;
7
8 constructor(extCtx: vscode.ExtensionContext) {
9 this.extCtx = extCtx;
10 }
11
12 get client(): lc.LanguageClient {
13 return Server.client;
14 }
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
23 registerCommand(name: string, factory: (ctx: Ctx) => Cmd) {
24 const fullName = `rust-analyzer.${name}`;
25 const cmd = factory(this);
26 const d = vscode.commands.registerCommand(fullName, cmd);
27 this.pushCleanup(d);
28 }
29
30 pushCleanup(d: { dispose(): any }) {
31 this.extCtx.subscriptions.push(d);
32 }
33}
34
35export type Cmd = (...args: any[]) => any;
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 1da10ebd0..a4149a059 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -9,8 +9,16 @@ import { StatusDisplay } from './commands/watch_status';
9import * as events from './events'; 9import * as events from './events';
10import * as notifications from './notifications'; 10import * as notifications from './notifications';
11import { Server } from './server'; 11import { Server } from './server';
12import { Ctx } from './ctx';
13
14let ctx!: Ctx;
12 15
13export async function activate(context: vscode.ExtensionContext) { 16export async function activate(context: vscode.ExtensionContext) {
17 ctx = new Ctx(context);
18 ctx.registerCommand('analyzerStatus', commands.analyzerStatus);
19 ctx.registerCommand('collectGarbage', commands.collectGarbage);
20 ctx.registerCommand('matchingBrace', commands.matchingBrace);
21
14 function disposeOnDeactivation(disposable: vscode.Disposable) { 22 function disposeOnDeactivation(disposable: vscode.Disposable) {
15 context.subscriptions.push(disposable); 23 context.subscriptions.push(disposable);
16 } 24 }
@@ -48,17 +56,6 @@ export async function activate(context: vscode.ExtensionContext) {
48 } 56 }
49 57
50 // Commands are requests from vscode to the language server 58 // Commands are requests from vscode to the language server
51 registerCommand(
52 'rust-analyzer.analyzerStatus',
53 commands.analyzerStatus.makeCommand(context),
54 );
55 registerCommand('rust-analyzer.collectGarbage', () =>
56 Server.client.sendRequest<null>('rust-analyzer/collectGarbage', null),
57 );
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);