]> git.lizzy.rs Git - rust.git/blob - editors/code/src/source_change.ts
Jump to sourceChanges in other files
[rust.git] / editors / code / src / source_change.ts
1 import * as vscode from 'vscode';
2 import * as lc from 'vscode-languageclient';
3 import * as ra from './rust-analyzer-api';
4
5 import { Ctx } from './ctx';
6
7 export async function applySourceChange(ctx: Ctx, change: ra.SourceChange) {
8     const client = ctx.client;
9     if (!client) return;
10
11     const wsEdit = client.protocol2CodeConverter.asWorkspaceEdit(
12         change.workspaceEdit,
13     );
14     let created;
15     let moved;
16     if (change.workspaceEdit.documentChanges) {
17         for (const docChange of change.workspaceEdit.documentChanges) {
18             if (lc.CreateFile.is(docChange)) {
19                 created = docChange.uri;
20             } else if (lc.RenameFile.is(docChange)) {
21                 moved = docChange.newUri;
22             }
23         }
24     }
25     const toOpen = created || moved;
26     const toReveal = change.cursorPosition;
27     await vscode.workspace.applyEdit(wsEdit);
28     if (toOpen) {
29         const toOpenUri = vscode.Uri.parse(toOpen);
30         const doc = await vscode.workspace.openTextDocument(toOpenUri);
31         await vscode.window.showTextDocument(doc);
32     } else if (toReveal) {
33         const uri = client.protocol2CodeConverter.asUri(
34             toReveal.textDocument.uri,
35         );
36         const position = client.protocol2CodeConverter.asPosition(
37             toReveal.position,
38         );
39         const editor = vscode.window.activeTextEditor;
40         if (!editor || !editor.selection.isEmpty) {
41             return;
42         }
43
44         if (editor.document.uri !== uri) {
45             const doc = await vscode.workspace.openTextDocument(uri);
46             await vscode.window.showTextDocument(doc);
47         }
48         editor.selection = new vscode.Selection(position, position);
49         editor.revealRange(
50             new vscode.Range(position, position),
51             vscode.TextEditorRevealType.Default,
52         );
53     }
54 }