Chapter 06

Text Document Synchronization

takl
takl
2020.12.22に更新

まずは Text Document Synchronization を使えるようにしましょう。Text Document Synchronization 関連のメッセージにはファイルを開いたことを知らせる textDocument/didOpen 、ファイルを変更したことを知らせる textDocument/didChange などがあります。これらのメッセージに対応すると、開いているファイルの中身がわかります。

まず initialize の response の capabilitiestextDocumentSync: 1 を加えます。

requestTable["initialize"] = (msg) => {
    const capabilities = {
        textDocumentSync: 1, // 1 は「毎回ファイルの中身を全部送る」の意。差分だけを送るモードもある。
    };

    sendMessage({ jsonrpc: "2.0", id: msg.id, result: { capabilities } });
}

これで「Language Server は Text Document Synchronization に対応しています」ということが Language Client に伝わります。開かれたファイルの URI は msg.params.textDocument.uri に、ファイルの中身は msg.params.textDocument.text に入ります。これを compile 関数に渡すなどしましょう。

oreore.js
function compile(uri, src) {
    logMessage(uri + ":" + src);
    // TODO: implement
}

notificationTable["textDocument/didOpen"] = (msg) => {
    const uri = msg.params.textDocument.uri;
    const text = msg.params.textDocument.text;
    compile(uri, text);
}

notificationTable["textDocument/didChange"] = (msg) => {
    if (msg.params.contentChanges.length !== 0) {
        const uri = msg.params.textDocument.uri;
        const text = msg.params.contentChanges[msg.params.contentChanges.length - 1].text;
        compile(uri, text);
    }
}

この状態でファイルを編集したりすると、 didOpen や didChange が飛んでくることがわかると思います。

* ここまでのソースコード *