diff options
-rw-r--r-- | editors/code/src/commands/analyzer_status.ts | 2 | ||||
-rw-r--r-- | editors/code/src/commands/expand_macro.ts | 102 | ||||
-rw-r--r-- | editors/code/src/commands/index.ts | 2 | ||||
-rw-r--r-- | editors/code/src/commands/syntax_tree.ts | 7 | ||||
-rw-r--r-- | editors/code/src/main.ts | 15 |
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 | ||
38 | class TextDocumentContentProvider | 38 | class 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 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import { Position, TextDocumentIdentifier } from 'vscode-languageclient'; | 2 | import * as lc from 'vscode-languageclient'; |
3 | import { Server } from '../server'; | ||
4 | 3 | ||
5 | export const expandMacroUri = vscode.Uri.parse( | 4 | import { Ctx, Cmd } from '../ctx'; |
6 | 'rust-analyzer://expandMacro/[EXPANSION].rs', | ||
7 | ); | ||
8 | |||
9 | export 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` |
50 | export function createHandle(provider: ExpandMacroContentProvider) { | 9 | export 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 | ||
66 | interface MacroExpandParams { | ||
67 | textDocument: TextDocumentIdentifier; | ||
68 | position: Position; | ||
69 | } | ||
70 | |||
71 | interface ExpandedMacro { | 29 | interface 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 | |||
43 | class 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'; | |||
6 | import { onEnter } from './on_enter'; | 6 | import { onEnter } from './on_enter'; |
7 | import { parentModule } from './parent_module'; | 7 | import { parentModule } from './parent_module'; |
8 | import { syntaxTree } from './syntax_tree'; | 8 | import { syntaxTree } from './syntax_tree'; |
9 | import * as expandMacro from './expand_macro'; | 9 | import { expandMacro } from './expand_macro'; |
10 | import * as inlayHints from './inlay_hints'; | 10 | import * as inlayHints from './inlay_hints'; |
11 | import * as runnables from './runnables'; | 11 | import * 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 | ||
67 | class TextDocumentContentProvider | 67 | class 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'; | |||
2 | import * as lc from 'vscode-languageclient'; | 2 | import * as lc from 'vscode-languageclient'; |
3 | 3 | ||
4 | import * as commands from './commands'; | 4 | import * as commands from './commands'; |
5 | import { ExpandMacroContentProvider } from './commands/expand_macro'; | ||
6 | import { HintsUpdater } from './commands/inlay_hints'; | 5 | import { HintsUpdater } from './commands/inlay_hints'; |
7 | import { StatusDisplay } from './commands/watch_status'; | 6 | import { StatusDisplay } from './commands/watch_status'; |
8 | import * as events from './events'; | 7 | import * 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 | ||