aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/commands/apply_source_change.ts
blob: dcbbb2b098441375d9c3e077c62676b00909096d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import * as vscode from 'vscode';
import * as lc from 'vscode-languageclient'

import { Server } from '../server';

interface FileSystemEdit {
    type: string;
    uri?: string;
    src?: string;
    dst?: string;
}

export interface SourceChange {
    label: string,
    sourceFileEdits: lc.TextDocumentEdit[],
    fileSystemEdits: FileSystemEdit[],
    cursorPosition?: lc.TextDocumentPositionParams,
}

export async function handle(change: SourceChange) {
    console.log(`applySOurceChange ${JSON.stringify(change)}`)
    let wsEdit = new vscode.WorkspaceEdit()
    for (let sourceEdit of change.sourceFileEdits) {
        let uri = Server.client.protocol2CodeConverter.asUri(sourceEdit.textDocument.uri)
        let edits = Server.client.protocol2CodeConverter.asTextEdits(sourceEdit.edits)
        wsEdit.set(uri, edits)
    }
    let created;
    let moved;
    for (let fsEdit of change.fileSystemEdits) {
        if (fsEdit.type == "createFile") {
            let uri = vscode.Uri.parse(fsEdit.uri!)
            wsEdit.createFile(uri)
            created = uri
        } else if (fsEdit.type == "moveFile") {
            let src = vscode.Uri.parse(fsEdit.src!)
            let dst = vscode.Uri.parse(fsEdit.dst!)
            wsEdit.renameFile(src, dst)
            moved = dst
        } else {
            console.error(`unknown op: ${JSON.stringify(fsEdit)}`)
        }
    }
    let toOpen = created || moved
    let toReveal = change.cursorPosition
    await vscode.workspace.applyEdit(wsEdit)
    if (toOpen) {
        let doc = await vscode.workspace.openTextDocument(toOpen)
        await vscode.window.showTextDocument(doc)
    } else if (toReveal) {
        let uri = Server.client.protocol2CodeConverter.asUri(toReveal.textDocument.uri)
        let position = Server.client.protocol2CodeConverter.asPosition(toReveal.position)
        let editor = vscode.window.activeTextEditor;
        if (!editor || editor.document.uri.toString() != uri.toString()) return
        if (!editor.selection.isEmpty) return
        editor!.selection = new vscode.Selection(position, position)
    }
}