2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

hacomonoAdvent Calendar 2024

Day 5

ruby-lsp に貢献しよう

Posted at

はじめに

最近、Rubyの開発環境において、多くの開発チームやプロジェクトで、VSCode から RubyMine への移行が進んでいる。

RubyMine は JetBrains 独自のコード解析機能を提供し、現時点では確かに ruby-lspより優れているように感じる。言語に依らず開発者が好きなエディタで開発できるのが、本来あるべき LSP を用いた開発環境の姿であるが、複数の言語を扱うプロジェクトにおいて、開発環境の分断化がされがちである。

  • JavaScript や TypeScript ならば VSCode
  • Ruby の開発には RubyMine
  • Go の開発には VSCode / GoLand

OSSとしてのRuby LSPの発展には、実際の開発現場からのフィードバックや貢献が必要である。なので、その第一歩として、単純に「使ってみる」ことから貢献しませんか?

本章では、使い方、どんな機能があるか、貢献の仕方、について紹介する。

使ってみよう

bundle install

# Gemfile
source "https://rubygems.org"

group :development do
  gem "ruby-lsp", require: false
  gem "rubocop", require: false
end

VScodeの設定
拡張をインストール

その他エディタへの導入
参照

既存プロジェクトで最新バージョンを試す

  1. プロジェクトの一つ上の階層に独自のワークスペースを作成する
  2. 独自でワークスペース(lsp.code-workspace)を作り、"rubyLsp.bundleGemfile":など必要な設定があれば追加
  3. ワークスペースから既存プロジェクトを開く
# イメージ
workspace/
  ├── Gemfile            # ruby-lspの最新バージョンを指定
  ├── workspace.code-workspace # パスの調整が必要な場合は、必要に応じで作成
  └── your-project/      # 既存のプロジェクト
      ├── Gemfile
      └── ...

どんな機能がある

基本は直感的に利用できる、よく使う代表例3つ紹介

1. 参照箇所検索

VScodeのサイドバーに参照箇所一覧が表示される。

image.png

class User
    attr_reader :name
    def initialize(name:)
        @name = name
    end
   
    def greeting # 👈 右クリック `find all reference`で参照箇所一覧を表示
        "Hello, #{name}!"
    end
end

現状、全てのクラスのgreetingを検索してしまう課題はある。

2. 定義ジャンプ

command + clickで定義元へジャンプする

user = User.new(name: 'Ruby')
user.greeting # 👈 Userのgreetingへジャンプ

admin = Admin.new(name: 'Kotlin')
admin.greeting # 👈 Adminのgreetingへジャンプ

3. 型推論

インスタンス名からクラスを推論し、インスタンスが持つメソッドを提案する

image.png

# `user` が Userクラスのインスタンスであることを推論する
user = User.new(name: 'Ruby')
user.gre # Userクラスが持つメソッドを提案 `greeting`

# 変数`k` は Userクラスのインスタンスであることを推論しない
k = User.new(name: 'Kotlin')
k.gre # クラスが持つメソッドを提案しない

user = Admin.new(name: 'Ruby')
# ⚠️ Userインスタンスと推論するので、Adminで定義していてもUserのgreetingにジャンプ
user.greeting

推論ミスで関係ない型を提案したり、意図しない定義ジャンプすることもある。
User クラスが既に定義されている場合、別箇所でuserを呼ぶと暗黙的にuserUserインスタンスと識別する。

その他にもいろんな機能が搭載されている

機能の課題

貢献してみる

環境構築方法

開発環境のセットアップ

  1. クローンしてVSCodeを開く
    git clone https://github.com/Shopify/ruby-lsp.git
    code ruby-lsp    
    
  2. 依存ツールインストール
    # root
    bundle install
    
    # cd vscode
    yarn install
    

開発の方法

ruby-lspでは、大きくvscode拡張機能とlsp開発があり、それぞれデバッグ方法は異なる

LSP 開発

  1. ワークスペース/lsp.code-workspace を開く

  2. 検証用プロジェクト サーバー起動、CMD/CTRL + SHIFT + P → 入力 「Debug the Ruby LSP
    image.png

  3. ruby-lsp Vscode Run/Debug → 「attach to existing server
    image.png

  4. 既存のプロジェクトを用いて検証できる状態になる

  5. 検証して、開発!

VSCode拡張の開発

  1. ワークスペース/lsp.code-workspace を開く
  2. ruby-lsp Vscode Run/Debug → 「Run Extension
    image.png
  3. 拡張デバッグ用のエディタが開くので、任意の検証用プロジェクトを開く
  4. 検証して、開発!

テストスクリプトの書き方は公式ドキュメントを参考

LSPのリクエスト周りの定義を理解する
LSPの用語や説明をまとめたドキュメント

課題を見つける

  • 100近く課題があり、今時点で毎日のペースで消化されており、日々進化している!

  • PRやコミット方法に厳格なルールはないので気軽に参加できる
    コミット例(私の)

最後に

商用ツールに頼らずもっとOSSとしていいものをいろんな人が快適にRubyを使えるようになればいいなと思う。
MCPよりLSP!

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?