Chapter 13

Completion

takl
takl
2020.12.22に更新

completion です。

capabilities に completionProvider: {} を追加します。すると様々なタイミングで textDocument/completion が飛んでくるようになります。典型例は Ctrl+Space を押したときなどです。

oreore.js
requestTable["initialize"] = (msg) => {
    const capabilities = {
        textDocumentSync: 1,
        definitionProvider: true,
        completionProvider: {} // <---- ここ
    };
    :
    :

意味解析時に作った scope を全て保持しているはずなので、その scope から補完候補の識別子を列挙するだけです。

requestTable["textDocument/completion"] = (msg) => {
    const uri = msg.params.textDocument.uri;
    const position = msg.params.position;
    const toplevelScope = buffers[uri].toplevelScope;
    const result = [];

    // globalScopeの変数(今回は組み込み関数のみ)はすべて補完対象
    for (const name in globalScope.definitions) {
        result.push({ label: name });
    }

    // toplevelScopeの変数(defunで定義されたもの)は全て補完対象
    for (const name in toplevelScope.definitions) {
        result.push({ label: name });
    }

    // localScopeの変数(今回は引数のみ)はカーソルが含まれているスコープのみ補完対象にする
    for (const localScope of toplevelScope.children) {
        if (positionInRange(position, rangeOfScope(localScope))) {
            for (const name in localScope.definitions) {
                result.push({ label: name });
            }
        }
    }

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

カーソル位置により異なったリストが表示されます。


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