Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyLSPのマルチバイト文字対応

Iori IKEDA
November 07, 2024

 RubyLSPのマルチバイト文字対応

Omotesando.rb #103 での発表資料です。RubyLSP に行ったマルチバイト文字の対応について話しました。

Iori IKEDA

November 07, 2024
Tweet

More Decks by Iori IKEDA

Other Decks in Programming

Transcript

  1. RubyLSPに潜む問題 • Definition jumps are not possible with files containing

    Japanese characters. · Issue #1347 · Shopify/ruby-lsp · GitHub • 意訳: 日本語が含まれていると動かない • これじゃん!!! • どうやらメンテナも認識しているようだが未対応 • でもどうやって直せばいいんだ...
  2. class Hoge
 def fuga
 puts "Hello"
 end
 end
 
 Hoge.new.fuga

    RubyLSPの仕組み 1. エディタ上で定義ジャンプ {
 "method": "textDocument/definition",
 "params": {
 "textDocument": {
 "uri": "file://a.rb"
 },
 "position": {
 "line": 6,
 "character": 9
 }
 }
 }

  3. 2. positionを先頭から何文字目かに変換 元のファイルでは 6行 9文字目 'class Hoge\ndef fuga\nputs "Hello"\nend\nend\n\nHoge.new.fuga\n' 


    class Hoge
 def fuga
 puts "Hello"
 end
 end
 
 Hoge.new.fuga RubyLSPの仕組み 53文字目
  4. class Hoge
 def fuga
 puts "Hello"
 end
 end
 
 Hoge.new.fuga

    RubyLSPの仕組み 4. 事前に作成したコードのIndex(辞書)から対象のノードを探す ノードが見つかったらLSPに結果を返す {
 "uri": "file://a.rb",
 "range": {
 "start": {
 "line": 1,
 "character": 2
 },
 "end": {
 "line": 3,
 "character": 5
 }
 }
 }

  5. 参考文献・資料 • Code indexing: How language servers understand our code

    • Language Server Protocol の仕様 及び実装方法 • Ruby LSP | An opinionated language server for Ruby. Batteries included! • https://github.com/Shopify/ruby-lsp/pull/2619 • https://github.com/Shopify/ruby-lsp/pull/2669