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.ts48
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');