diff options
Diffstat (limited to 'editors/code/src/commands/apply_source_change.ts')
-rw-r--r-- | editors/code/src/commands/apply_source_change.ts | 58 |
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 @@ | |||
1 | import * as vscode from 'vscode'; | ||
2 | import * as lc from 'vscode-languageclient' | ||
3 | |||
4 | import { Server } from '../server'; | ||
5 | |||
6 | interface FileSystemEdit { | ||
7 | type: string; | ||
8 | uri?: string; | ||
9 | src?: string; | ||
10 | dst?: string; | ||
11 | } | ||
12 | |||
13 | export interface SourceChange { | ||
14 | label: string, | ||
15 | sourceFileEdits: lc.TextDocumentEdit[], | ||
16 | fileSystemEdits: FileSystemEdit[], | ||
17 | cursorPosition?: lc.TextDocumentPositionParams, | ||
18 | } | ||
19 | |||
20 | export 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 | } | ||