Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'editors/code/src/commands.ts')
| -rw-r--r-- | editors/code/src/commands.ts | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts index fe006a63e2..2802668be3 100644 --- a/editors/code/src/commands.ts +++ b/editors/code/src/commands.ts @@ -432,6 +432,54 @@ export function viewHir(ctx: Ctx): Cmd { }; } +export function viewFileText(ctx: Ctx): Cmd { + const tdcp = new class implements vscode.TextDocumentContentProvider { + readonly uri = vscode.Uri.parse('rust-analyzer://viewFileText/file.rs'); + readonly eventEmitter = new vscode.EventEmitter<vscode.Uri>(); + constructor() { + vscode.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, ctx.subscriptions); + vscode.window.onDidChangeActiveTextEditor(this.onDidChangeActiveTextEditor, this, ctx.subscriptions); + } + + private onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent) { + if (isRustDocument(event.document)) { + // We need to order this after language server updates, but there's no API for that. + // Hence, good old sleep(). + void sleep(10).then(() => this.eventEmitter.fire(this.uri)); + } + } + private onDidChangeActiveTextEditor(editor: vscode.TextEditor | undefined) { + if (editor && isRustEditor(editor)) { + this.eventEmitter.fire(this.uri); + } + } + + provideTextDocumentContent(_uri: vscode.Uri, ct: vscode.CancellationToken): vscode.ProviderResult<string> { + const rustEditor = ctx.activeRustEditor; + const client = ctx.client; + if (!rustEditor || !client) return ''; + + const params = client.code2ProtocolConverter.asTextDocumentIdentifier(rustEditor.document); + return client.sendRequest(ra.viewFileText, params, ct); + } + + get onDidChange(): vscode.Event<vscode.Uri> { + return this.eventEmitter.event; + } + }; + + ctx.pushCleanup(vscode.workspace.registerTextDocumentContentProvider('rust-analyzer', tdcp)); + + return async () => { + const document = await vscode.workspace.openTextDocument(tdcp.uri); + tdcp.eventEmitter.fire(tdcp.uri); + void await vscode.window.showTextDocument(document, { + viewColumn: vscode.ViewColumn.Two, + preserveFocus: true + }); + }; +} + export function viewItemTree(ctx: Ctx): Cmd { const tdcp = new class implements vscode.TextDocumentContentProvider { readonly uri = vscode.Uri.parse('rust-analyzer://viewItemTree/itemtree.rs'); |