language serverの存在をきのう知った.マイクロソフトが作っている,エディタから独立した,IDE用の補完のための仕組み.
Perl用のlanguage-serverほしいので,Ruby版の実装を参考になるかと思って眺めてた.
https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md
- 補完出してください,とかそういうのをJSON RPCで送る
- 具体的なエディタからは独立しているという世界観のはずだけどCodeLensのコマンドとかあってVisualStudioっぽさもある
https://github.com/mtsmfm/language_server-ruby
Ruby用のlanguage-server.上のメソッドがすべて実装されてるわけではない.
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server.rb#L123
- 補完を出すか,定義を出すか,の2種類に対応している
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server/project.rb
- データを保持するやつ リポジトリ
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server/project/parser.rb
- パーサー Ripperを使っている パースした結果はNodeクラスのインスタンスになる
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server/linter/ruby_wc.rb
- linter RubyWCというのはruby -wcのこと Rubyのプロセスを起動してlintする
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server/completion_provider/ad_hoc.rb
- アドホックに補完集める君 Projectが保持している,パースした結果から集める
- https://github.com/mtsmfm/language_server-ruby/blob/master/lib/language_server/completion_provider/rcodetools.rb
- rcodetoolsを使った補完 こういう外部ツールがあれば,JSON RPCとのつなぎこみを作れば完成するので便利ですね
- https://github.com/rcodetools/rcodetools
- https://github.com/mtsmfm/language_server-ruby/blob/master/Dockerfile
- こういう開発用のツールもDockerで動く時代になってきたのはおもしろい
https://github.com/mtsmfm/language_server-protocol-ruby
こっちはprotocolの定義
https://github.com/mtsmfm/language_server-protocol-ruby
- https://github.com/mtsmfm/language_server-protocol-ruby/tree/master/lib/language_server/protocol/interface
- 仕様通りに延々と実装されている
- https://github.com/mtsmfm/language_server-protocol-ruby/blob/master/scripts/generateFiles.ts
- このスクリプトでRubyのコードを生成している
- https://github.com/mtsmfm/language_server-protocol-ruby/blob/master/scripts/generateFiles.ts#L143-L182
- テンプレート
- https://github.com/mtsmfm/language_server-protocol-ruby/blob/master/scripts/generateFiles.ts#L130
- markdownをとってきてパースしている
https://github.com/mtsmfm/vscode-ruby-lsc
VSCode用のプラグイン
- https://github.com/mtsmfm/vscode-ruby-lsc/blob/master/src/extension.ts
- プラグインの実装
- https://github.com/mtsmfm/vscode-ruby-lsc/blob/master/src/extension.ts#L18
- language-serverをdocker pullしたりdocker runしたりしていてかっこよすぎる
- https://github.com/Microsoft/vscode-languageserver-node
- LanguageClientはこっちのモジュールに入っている
- https://github.com/Microsoft/vscode-languageserver-node/blob/master/client/src/main.ts#L71
- プロセス立ち上げる君
感想
language-server-protocolはあくまでプロトコルであり,ソースコードを解析して補完を出す技術は別に必要.
Perlの場合,Class::Inspectorでがんばる,くらいの世界がここ数年くらい続いている気がする.ほかになんかいいのありますか?