1 import * as vscode from 'vscode';
2 import * as lc from 'vscode-languageclient';
4 import { Ctx, Cmd } from '../ctx';
6 // Opens the virtual file that will show the syntax tree
8 // The contents of the file come from the `TextDocumentContentProvider`
9 export function expandMacro(ctx: Ctx): Cmd {
10 const tdcp = new TextDocumentContentProvider(ctx);
12 vscode.workspace.registerTextDocumentContentProvider(
19 const document = await vscode.workspace.openTextDocument(tdcp.uri);
20 tdcp.eventEmitter.fire(tdcp.uri);
21 return vscode.window.showTextDocument(
23 vscode.ViewColumn.Two,
29 interface ExpandedMacro {
34 function code_format(expanded: ExpandedMacro): string {
35 let result = `// Recursive expansion of ${expanded.name}! macro\n`;
36 result += '// ' + '='.repeat(result.length - 3);
38 result += expanded.expansion;
43 class TextDocumentContentProvider
44 implements vscode.TextDocumentContentProvider {
46 uri = vscode.Uri.parse('rust-analyzer://expandMacro/[EXPANSION].rs');
47 eventEmitter = new vscode.EventEmitter<vscode.Uri>();
49 constructor(ctx: Ctx) {
53 async provideTextDocumentContent(_uri: vscode.Uri): Promise<string> {
54 const editor = vscode.window.activeTextEditor;
55 if (editor == null) return '';
57 const position = editor.selection.active;
58 const request: lc.TextDocumentPositionParams = {
59 textDocument: { uri: editor.document.uri.toString() },
62 const expanded = await this.ctx.client.sendRequest<ExpandedMacro>(
63 'rust-analyzer/expandMacro',
67 if (expanded == null) return 'Not available';
69 return code_format(expanded);
72 get onDidChange(): vscode.Event<vscode.Uri> {
73 return this.eventEmitter.event;