Skip to content

Instantly share code, notes, and snippets.

@kyoh86
Last active July 15, 2024 08:25
Show Gist options
  • Save kyoh86/83abb1dad1b584d2fb6197adaa5ad409 to your computer and use it in GitHub Desktop.
Save kyoh86/83abb1dad1b584d2fb6197adaa5ad409 to your computer and use it in GitHub Desktop.

検証したい事実

エディタのLSP Clientが

  • 仕様通りのClient
  • 仕様とは異なる実装のClient

どちらになっているか、を検証したい

やってほしいこと

  • 仕様とは異なる実装のサーバーを使って、継続する複数行にまたがるフォーマットをかける
  • 仕様通りに修正したサーバーを使って、同じ操作をする

結果として意図通りの結果になるのはどちらか、を観察する

詳細な手順

1. efm-langserverのconfig(~/.config/efm-langserver/config.yaml)を、以下の様なものに変える

version: 2

tools:
  echo-fix: &echo-fix
    format-command: zsh -c 'print "foo\nbar\nbaz"'
    format-stdin: true

languages:
  json:
    - <<: *echo-fix

(この設定は、JSONファイルを常に foo\nbar\nbaz に書き換えてしまう、という設定になっている)

2. エディタでefm-langserverを使ったフォーマットをかけられるようにする

上記の設定で言えばJSONを対象にしているため、JSONに対して実行できる様にする

3. フォーマットをかけてみる

ファイルの中身が

foo
bar
baz

に書き換えられた場合は、意図通りの挙動。

4. 既存のefm-langserverの代わりにパッチを当てたefm-langserverをインストールする

https://github.com/kyoh86/efm-langserver/tree/fix-281

をインストールして、既存のefm-langserver実装と差し替える

※インストールにGoがいるので、Goなんてない!という場合はこちらでクロスコンパイルしたものをお渡しします

5. フォーマットをかけてみる

ファイルの中身が

foo
bar
baz

に書き換えられた場合は、意図通りの挙動。

6. 結論を報告する

3.で意図通りの挙動になった場合は、仕様とは異なるクライアント実装になっている。 5.で意図通りの挙動になった場合は、仕様通りのクライアント実装になっている。

経緯

NeovimのClient実装が修正された

Neovimの内部実装LSP Clientは、長らく 「Language Serverから返ってきたText Editレスポンスのうち、位置が同じものは、返ってきたレスポンスを逆順に処理する」 という仕様とは異なる実装になっていた。

(※この実装がどこに依拠していたのかは不明)

これが6月7日のコミットで「仕様通りの」 「Language Serverから返ってきたText Editレスポンスを返ってきた順のまま処理する」 Clientに是正された。

Serverとの実装齟齬が発生した

efm-langserverはNeovimの仕様とは異なる実装に合わせた形で実装されている。 そのため、Neovimの方が修正されたことで、Neovimでは efm-langserverのレスポンスが逆順に適用されるようになってしまった。

他のClient実装も誤っている

efm-langserverに修正を加えたいが、各種他クライアントも仕様とは異なる実装に依っており、 修正が逆にユーザーの意図しない挙動に繋がってしまう。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment