aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/code/src/commands/analyzer_status.ts2
-rw-r--r--editors/code/src/commands/expand_macro.ts102
-rw-r--r--editors/code/src/commands/index.ts2
-rw-r--r--editors/code/src/commands/syntax_tree.ts7
-rw-r--r--editors/code/src/main.ts15
5 files changed, 53 insertions, 75 deletions
diff --git a/editors/code/src/commands/analyzer_status.ts b/editors/code/src/commands/analyzer_status.ts
index e680179ae..2c8362286 100644
--- a/editors/code/src/commands/analyzer_status.ts
+++ b/editors/code/src/commands/analyzer_status.ts
@@ -37,7 +37,7 @@ export function analyzerStatus(ctx: Ctx): Cmd {
37 37
38class TextDocumentContentProvider 38class TextDocumentContentProvider
39 implements vscode.TextDocumentContentProvider { 39 implements vscode.TextDocumentContentProvider {
40 ctx: Ctx; 40 private ctx: Ctx;
41 uri = vscode.Uri.parse('rust-analyzer-status://status'); 41 uri = vscode.Uri.parse('rust-analyzer-status://status');
42 eventEmitter = new vscode.EventEmitter<vscode.Uri>(); 42 eventEmitter = new vscode.EventEmitter<vscode.Uri>();
43 43
diff --git a/editors/code/src/commands/expand_macro.ts b/editors/code/src/commands/expand_macro.ts
index 17c78280a..da208257a 100644
--- a/editors/code/src/commands/expand_macro.ts
+++ b/editors/code/src/commands/expand_macro.ts
@@ -1,60 +1,23 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import { Position, TextDocumentIdentifier } from 'vscode-languageclient'; 2import * as lc from 'vscode-languageclient';
3import { Server } from '../server';
4 3
5export const expandMacroUri = vscode.Uri.parse( 4import { Ctx, Cmd } from '../ctx';
6 'rust-analyzer://expandMacro/[EXPANSION].rs',
7);
8
9export class ExpandMacroContentProvider
10 implements vscode.TextDocumentContentProvider {
11 public eventEmitter = new vscode.EventEmitter<vscode.Uri>();
12
13 public provideTextDocumentContent(
14 _uri: vscode.Uri,
15 ): vscode.ProviderResult<string> {
16 async function handle() {
17 const editor = vscode.window.activeTextEditor;
18 if (editor == null) {
19 return '';
20 }
21
22 const position = editor.selection.active;
23 const request: MacroExpandParams = {
24 textDocument: { uri: editor.document.uri.toString() },
25 position,
26 };
27 const expanded = await Server.client.sendRequest<ExpandedMacro>(
28 'rust-analyzer/expandMacro',
29 request,
30 );
31
32 if (expanded == null) {
33 return 'Not available';
34 }
35
36 return code_format(expanded);
37 }
38
39 return handle();
40 }
41
42 get onDidChange(): vscode.Event<vscode.Uri> {
43 return this.eventEmitter.event;
44 }
45}
46 5
47// Opens the virtual file that will show the syntax tree 6// Opens the virtual file that will show the syntax tree
48// 7//
49// The contents of the file come from the `TextDocumentContentProvider` 8// The contents of the file come from the `TextDocumentContentProvider`
50export function createHandle(provider: ExpandMacroContentProvider) { 9export function expandMacro(ctx: Ctx): Cmd {
51 return async () => { 10 const tdcp = new TextDocumentContentProvider(ctx);
52 const uri = expandMacroUri; 11 ctx.pushCleanup(
53 12 vscode.workspace.registerTextDocumentContentProvider(
54 const document = await vscode.workspace.openTextDocument(uri); 13 'rust-analyzer',
55 14 tdcp,
56 provider.eventEmitter.fire(uri); 15 ),
16 );
57 17
18 return async () => {
19 const document = await vscode.workspace.openTextDocument(tdcp.uri);
20 tdcp.eventEmitter.fire(tdcp.uri);
58 return vscode.window.showTextDocument( 21 return vscode.window.showTextDocument(
59 document, 22 document,
60 vscode.ViewColumn.Two, 23 vscode.ViewColumn.Two,
@@ -63,11 +26,6 @@ export function createHandle(provider: ExpandMacroContentProvider) {
63 }; 26 };
64} 27}
65 28
66interface MacroExpandParams {
67 textDocument: TextDocumentIdentifier;
68 position: Position;
69}
70
71interface ExpandedMacro { 29interface ExpandedMacro {
72 name: string; 30 name: string;
73 expansion: string; 31 expansion: string;
@@ -81,3 +39,37 @@ function code_format(expanded: ExpandedMacro): string {
81 39
82 return result; 40 return result;
83} 41}
42
43class TextDocumentContentProvider
44 implements vscode.TextDocumentContentProvider {
45 private ctx: Ctx;
46 uri = vscode.Uri.parse('rust-analyzer://expandMacro/[EXPANSION].rs');
47 eventEmitter = new vscode.EventEmitter<vscode.Uri>();
48
49 constructor(ctx: Ctx) {
50 this.ctx = ctx;
51 }
52
53 async provideTextDocumentContent(_uri: vscode.Uri): Promise<string> {
54 const editor = vscode.window.activeTextEditor;
55 if (editor == null) return '';
56
57 const position = editor.selection.active;
58 const request: lc.TextDocumentPositionParams = {
59 textDocument: { uri: editor.document.uri.toString() },
60 position,
61 };
62 const expanded = await this.ctx.client.sendRequest<ExpandedMacro>(
63 'rust-analyzer/expandMacro',
64 request,
65 );
66
67 if (expanded == null) return 'Not available';
68
69 return code_format(expanded);
70 }
71
72 get onDidChange(): vscode.Event<vscode.Uri> {
73 return this.eventEmitter.event;
74 }
75}
diff --git a/editors/code/src/commands/index.ts b/editors/code/src/commands/index.ts
index 8f91b3b7d..325ae3da8 100644
--- a/editors/code/src/commands/index.ts
+++ b/editors/code/src/commands/index.ts
@@ -6,7 +6,7 @@ import { joinLines } from './join_lines';
6import { onEnter } from './on_enter'; 6import { onEnter } from './on_enter';
7import { parentModule } from './parent_module'; 7import { parentModule } from './parent_module';
8import { syntaxTree } from './syntax_tree'; 8import { syntaxTree } from './syntax_tree';
9import * as expandMacro from './expand_macro'; 9import { expandMacro } from './expand_macro';
10import * as inlayHints from './inlay_hints'; 10import * as inlayHints from './inlay_hints';
11import * as runnables from './runnables'; 11import * as runnables from './runnables';
12 12
diff --git a/editors/code/src/commands/syntax_tree.ts b/editors/code/src/commands/syntax_tree.ts
index 9831c2a2e..20ff7e5ca 100644
--- a/editors/code/src/commands/syntax_tree.ts
+++ b/editors/code/src/commands/syntax_tree.ts
@@ -66,10 +66,9 @@ interface SyntaxTreeParams {
66 66
67class TextDocumentContentProvider 67class TextDocumentContentProvider
68 implements vscode.TextDocumentContentProvider { 68 implements vscode.TextDocumentContentProvider {
69 ctx: Ctx; 69 private ctx: Ctx;
70 uri = vscode.Uri.parse('rust-analyzer://syntaxtree'); 70 uri = vscode.Uri.parse('rust-analyzer://syntaxtree');
71 eventEmitter = new vscode.EventEmitter<vscode.Uri>(); 71 eventEmitter = new vscode.EventEmitter<vscode.Uri>();
72 syntaxTree: string = 'Not available';
73 72
74 constructor(ctx: Ctx) { 73 constructor(ctx: Ctx) {
75 this.ctx = ctx; 74 this.ctx = ctx;
@@ -86,8 +85,8 @@ class TextDocumentContentProvider
86 range = editor.selection.isEmpty 85 range = editor.selection.isEmpty
87 ? undefined 86 ? undefined
88 : this.ctx.client.code2ProtocolConverter.asRange( 87 : this.ctx.client.code2ProtocolConverter.asRange(
89 editor.selection, 88 editor.selection,
90 ); 89 );
91 } 90 }
92 91
93 const request: SyntaxTreeParams = { 92 const request: SyntaxTreeParams = {
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index d92cd164f..b8e3396a6 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -2,7 +2,6 @@ import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient'; 2import * as lc from 'vscode-languageclient';
3 3
4import * as commands from './commands'; 4import * as commands from './commands';
5import { ExpandMacroContentProvider } from './commands/expand_macro';
6import { HintsUpdater } from './commands/inlay_hints'; 5import { HintsUpdater } from './commands/inlay_hints';
7import { StatusDisplay } from './commands/watch_status'; 6import { StatusDisplay } from './commands/watch_status';
8import * as events from './events'; 7import * as events from './events';
@@ -20,6 +19,7 @@ export async function activate(context: vscode.ExtensionContext) {
20 ctx.registerCommand('joinLines', commands.joinLines); 19 ctx.registerCommand('joinLines', commands.joinLines);
21 ctx.registerCommand('parentModule', commands.parentModule); 20 ctx.registerCommand('parentModule', commands.parentModule);
22 ctx.registerCommand('syntaxTree', commands.syntaxTree); 21 ctx.registerCommand('syntaxTree', commands.syntaxTree);
22 ctx.registerCommand('expandMacro', commands.expandMacro);
23 23
24 function disposeOnDeactivation(disposable: vscode.Disposable) { 24 function disposeOnDeactivation(disposable: vscode.Disposable) {
25 context.subscriptions.push(disposable); 25 context.subscriptions.push(disposable);
@@ -65,25 +65,12 @@ export async function activate(context: vscode.ExtensionContext) {
65 params => watchStatus.handleProgressNotification(params), 65 params => watchStatus.handleProgressNotification(params),
66 ], 66 ],
67 ]; 67 ];
68 const expandMacroContentProvider = new ExpandMacroContentProvider();
69 68
70 // The events below are plain old javascript events, triggered and handled by vscode 69 // The events below are plain old javascript events, triggered and handled by vscode
71 vscode.window.onDidChangeActiveTextEditor( 70 vscode.window.onDidChangeActiveTextEditor(
72 events.changeActiveTextEditor.makeHandler(), 71 events.changeActiveTextEditor.makeHandler(),
73 ); 72 );
74 73
75 disposeOnDeactivation(
76 vscode.workspace.registerTextDocumentContentProvider(
77 'rust-analyzer',
78 expandMacroContentProvider,
79 ),
80 );
81
82 registerCommand(
83 'rust-analyzer.expandMacro',
84 commands.expandMacro.createHandle(expandMacroContentProvider),
85 );
86
87 const startServer = () => Server.start(allNotifications); 74 const startServer = () => Server.start(allNotifications);
88 const reloadCommand = () => reloadServer(startServer); 75 const reloadCommand = () => reloadServer(startServer);
89 76