みてね Tech Blog
💎

SerenaのRubyサポートをRuby LSPに移行した

に公開

はじめに

変化の激しいAI界隈、既に旬は過ぎているかもしれませんが、引き続き Serena MCP Server (以下Serena) のRubyサポート改善活動を行っています。
前回の取り組みは以下の記事をご覧下さい。
Serena MCPのRubyサポートを改善してみた

背景

大規模コードベースにおける問題

SerenaのRubyサポートにおいては、元々 Solargraph が利用されていました。
これは歴史のあるRuby向けLSPですが、我々のような大規模なコードベースでは以下のような問題を抱えていました。

  • 静的解析を前提としているため、コードのインデックス生成に時間がかかる
  • 動的に生成されるメソッドや Rails 特有の DSL (ActiveRecord等) の解析に弱く、補完が外れやすい
  • (上記の結果として) シンボル検索がうまく機能しない

これらにより、Serenaを導入しても期待通りに動作しない状況が発生していました。

解決策

根本的な解決策として、Serenaで利用するLSPを Ruby LSP へ移行することを検討しました。
Ruby LSPはShopifyにより開発が行われているLSPであり、Solargraphと比較して以下の点で優れています。

  • オンデマンド解析が中心で、巨大コードベースでも必要部分だけ処理する
  • Rails/RSpec アドオンにより DSL を理解し、動的メソッドやテスト補助を補完に反映

これらの特徴により、企業が扱うような大規模コードベースにおいては、Ruby LSPのほうが向いているのではないかと考えました。

移行の進め方

まずはPoC

そもそもRuby LSPに移行したらうまく動作するのか?を検証するために、Serenaをforkして検証を行いました。
https://github.com/kiakiraki/serena/pull/12

あくまで手元での動作確認が目的であるため、後方互換性を無視した最小限の実装です。
結果として、我々の大規模コードベースでもシンボル検索が高速に動作し、期待通りの挙動が得られました。

そして相談

Ruby LSPが期待通りに動作するという確認はできましたが、サポートするLSPを移行するという大きな仕様変更であり、いきなりPRを送りつけるのは憚られました。
そこで、事前にIssueを発行し、仕様変更についての相談を行いました。
https://github.com/oraios/serena/issues/535

相談の要点は以下です。

  • 大規模コードベースでは、SolargraphによるRubyサポートがうまく動作しないこと
  • Ruby LSPへの移行により改善が期待できること
  • 手元でPoCを実施し、問題がなかったこと

メンテナからはすぐに反応があり、以下の回答が得られました

  • よいアイデアだということ
  • Solargraphサポートを、後方互換性のために Experimental 扱いで残すこと

Rubyを常用していない人に対して移行の利点を理解してもらうのは難しいかも?とも思いましたが、結果としてメンテナに快諾していただけました。

PR作成

メンテナからの許諾が得られたので、いよいよPRの作成です。
既にPoCを実施していたこともあり、実装自体はスムーズに行えました。

実装時に注意していた点は以下です。

  • 既存コードとの差分を最小限に保ち、レビューしやすいようにすること
  • Solargraphとの後方互換性を維持すること

最終的なPRはこちらです。
https://github.com/oraios/serena/pull/540

Issue作成から1日、PR作成から半日程度でマージされ、なかなかのスピード感で対応できたのではないかと思います。

まとめ

SerenaのRubyサポートをRuby LSPへ移行することにより、大規模コードベースでも快適に動作するようになりました。
メンテナに事前に相談を行ったことにより、PRをスムーズにマージしてもらうことができました。

みてね Tech Blog
みてね Tech Blog

Discussion