Language Server Protocolでのcompletion responseの中身

Language Server Protocolのサーバ側の実装リスト

Language Servers

を見ると、同じ言語でも複数の実装が存在するものが多く、 どれを選べば良いか、悩ましい。選択肢が多いのは良い面も多いが・・・

エディタによっては(Emacsとかvimとか) Tools supporting the LSP によると、クライアント側の実装も複数あり、組み合わせの問題は発生しそうである。

LSPの利点として、エディタ側は言語非依存になるから、開発が楽ということがあるが、 サーバの実装が異るようだと、対応するのは大変ではないだろうか。

例えば、補完リクエスト(textDocument/completion)の応答の中身なんかは、微妙な違いがあるようだ。

幾つか試した結果をメモっておく。

solargraph ( https://github.com/castwide/solargraph )の場合

solargraphはruby用のlanguage server。 試したバージョンは、0.31.2。

行頭で"c"とタイプしたときの補完リストの一部。補完候補の文字列は"label"や"textEdit"=>"newEdit"が使えるだろうか。

clangd (https://clang.llvm.org/extra/clangd/ ) の場合

C++用なのか。 試したバージョンは、 clangd version 8.0.0 (tags/RELEASE_800/final)

"#"とタイプした場合のレスポンスの一部。"insertText"があるが、これはdeprecated。"textEdit"は使えるが、 solargraphの場合と異なり、入力済みの"#"は含まれていない。"kind"は15なので、これはSnippetということらしい。

pylsの場合

python用。バージョンは、0.26.1 pylsだと、"insertText"はあるが、"textEdit"は返ってこない。 "documentation"が長い。 "detail"はからっぽ。

と、様々。

  • "label"は必ず付いているのだけど、"label"に含まれる情報は、サーバにより変わる。
  • insertText"と"textEdit"は無い場合もある。
  • 入力済みの部分が補完候補に含まれる場合と含まれない場合がある。

など、クライアント側でサーバの差を考慮する必要がある。

あぁ、困った。