aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/commands/apply_source_change.ts
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/commands/apply_source_change.ts')
-rw-r--r--editors/code/src/commands/apply_source_change.ts58
1 files changed, 58 insertions, 0 deletions
diff --git a/editors/code/src/commands/apply_source_change.ts b/editors/code/src/commands/apply_source_change.ts
new file mode 100644
index 000000000..dcbbb2b09
--- /dev/null
+++ b/editors/code/src/commands/apply_source_change.ts
@@ -0,0 +1,58 @@
1import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient'
3
4import { Server } from '../server';
5
6interface FileSystemEdit {
7 type: string;
8 uri?: string;
9 src?: string;
10 dst?: string;
11}
12
13export interface SourceChange {
14 label: string,
15 sourceFileEdits: lc.TextDocumentEdit[],
16 fileSystemEdits: FileSystemEdit[],
17 cursorPosition?: lc.TextDocumentPositionParams,
18}
19
20export async function handle(change: SourceChange) {
21 console.log(`applySOurceChange ${JSON.stringify(change)}`)
22 let wsEdit = new vscode.WorkspaceEdit()
23 for (let sourceEdit of change.sourceFileEdits) {
24 let uri = Server.client.protocol2CodeConverter.asUri(sourceEdit.textDocument.uri)
25 let edits = Server.client.protocol2CodeConverter.asTextEdits(sourceEdit.edits)
26 wsEdit.set(uri, edits)
27 }
28 let created;
29 let moved;
30 for (let fsEdit of change.fileSystemEdits) {
31 if (fsEdit.type == "createFile") {
32 let uri = vscode.Uri.parse(fsEdit.uri!)
33 wsEdit.createFile(uri)
34 created = uri
35 } else if (fsEdit.type == "moveFile") {
36 let src = vscode.Uri.parse(fsEdit.src!)
37 let dst = vscode.Uri.parse(fsEdit.dst!)
38 wsEdit.renameFile(src, dst)
39 moved = dst
40 } else {
41 console.error(`unknown op: ${JSON.stringify(fsEdit)}`)
42 }
43 }
44 let toOpen = created || moved
45 let toReveal = change.cursorPosition
46 await vscode.workspace.applyEdit(wsEdit)
47 if (toOpen) {
48 let doc = await vscode.workspace.openTextDocument(toOpen)
49 await vscode.window.showTextDocument(doc)
50 } else if (toReveal) {
51 let uri = Server.client.protocol2CodeConverter.asUri(toReveal.textDocument.uri)
52 let position = Server.client.protocol2CodeConverter.asPosition(toReveal.position)
53 let editor = vscode.window.activeTextEditor;
54 if (!editor || editor.document.uri.toString() != uri.toString()) return
55 if (!editor.selection.isEmpty) return
56 editor!.selection = new vscode.Selection(position, position)
57 }
58}