]> git.lizzy.rs Git - rust.git/blob - editors/code/src/commands/expand_macro.ts
3fc3e0391725f7a321e8464206ab3827fde3b059
[rust.git] / editors / code / src / commands / expand_macro.ts
1 import * as vscode from 'vscode';
2 import { Position, TextDocumentIdentifier } from 'vscode-languageclient';
3 import { Server } from '../server';
4
5 interface ExpandedMacro {
6     name: string,
7     expansion: string,
8 }
9
10 function code_format(expanded: ExpandedMacro): vscode.MarkdownString {
11     const markdown = new vscode.MarkdownString(
12         `#### Recursive expansion of ${expanded.name}! macro`
13     );
14     markdown.appendCodeblock(expanded.expansion, 'rust');
15     return markdown;
16 }
17
18 export class ExpandMacroHoverProvider implements vscode.HoverProvider {
19     public provideHover(
20         document: vscode.TextDocument,
21         position: vscode.Position,
22         token: vscode.CancellationToken
23     ): Thenable<vscode.Hover | null> | null {
24         async function handle() {
25             const request: MacroExpandParams = {
26                 textDocument: { uri: document.uri.toString() },
27                 position
28             };
29             const result = await Server.client.sendRequest<ExpandedMacro>(
30                 'rust-analyzer/expandMacro',
31                 request
32             );
33             if (result != null) {
34                 const formated = code_format(result);
35                 return new vscode.Hover(formated);
36             }
37
38             return null;
39         }
40
41         return handle();
42     }
43 }
44
45 interface MacroExpandParams {
46     textDocument: TextDocumentIdentifier;
47     position: Position;
48 }