LSPの実装について

やっぱりサーバによって挙動が異なるので、気づいた点をメモっておく。

initializeの応答

最初にclientからinitializeリクエストを送ると、サーバからレスポンスが返ってくるのだが、 応答に時間がかかるサーバと、すぐに返してくるサーバがある。

solargraphなんかは、結構時間がかかる。 場合によっては10秒とかかかるので、initialize投げておいて、 別の処理に移っておく必要がある。

一方で、cqueryはすぐに返ってくる。 ただし、裏でファイルのindex化の処理などをやっているようで、 しばらく、"$cquery/progess"というnotificationを送ってくる。 本当に、初期化が終了したタイミングを掴みづらい。

formatting

‘textDocument/formatting’ というメソッドがあり、文字通り整形してくれる。 formattingはファイル全体を対象にしている。部分指定では、'rangeFormatting'というのがある。

solargraphで試すと、ファイル全体を差し替えるようなtextEdit[]が返ってくるので、 そのまま入れ替えれば良い。

cqueryだと、変更箇所だけを指定したtextEdit配列が返ってくるので、 個々に処理しないといけない。

クライアント側を実装するのに、どんなresponseが返ってくるのかは、実物を見るほうが判りやすいのだが、 幾つかのサーバを試さないと、予期せぬ動作に悩まされることが多い印象。