Good first issues of TypeProf
こんにちは、2024 年に新卒で入社し、ジョブハウスで主にフロントエンドを担当している Kaffff です。
本記事では RubyKaigi 2024 2 日目に発表された遠藤さん(@mametter)のセッション「Good first issues of TypeProf」をまとめさせていただきました。 セッションの内容としては、 mametter さんが Typeprof の開発を手伝ってみたいという方のために、開発の仕方や内部の実装を解説するという内容でした。
Typeprof とは
Ruby の エディタサポートを目的とした静的型解析ツールです。 Typeprof は型注釈なしでの型推論を目指していることが特徴です。
下の画像は Typeprof の VSCode 拡張機能により型推論された様子です。メソッドの上部に表示された灰色の文字が Typeprof により推論された型注釈です。
Typeprof には以下の機能があります。
- 型推論
- 型エラー表示
- 定義ジャンプ
- 補完機能 など
また本セッションで、新たな機能としてメソッドや定数のリネーム機能や参照先を表示する機能が紹介されていました。
Typeprof の開発手法
Typeprof の開発はほとんど mametter さん 1 人で行われており、以下の流れで開発を進めているそうです。
- テストシナリオを書く
- 実装する
- シナリオテストをパスさせる
テストシナリオのコード例は以下になります。
このテストを走らせるには Typeprof リポジトリ内の tool/scenario_runner.rb
を実行します。
## update: test.rb def foo = "symbol#{ 42 }" ## assert: test.rb class Object def foo: -> String end ## update: test.rb def foo = :"symbol#{ 42 }" ## assert: test.rb class Object def foo: -> Symbol end
Typeprof の内部実装
Typeprof の内部では Ruby で書かれたコードを以下のようなデータフローの Graph に変換しています。
https://speakerdeck.com/mame/good-first-issues-of-typeprof?slide=30
この Graph は、以下の流れで生成されます。
Code -> AST -> ChangeSet -> Graph
まず Ruby のコードを Prism により AST にパースします。 次に差分解析を行うために AST から ChangeSet を作成します。 差分解析とは、コードの一部に変更があったとき、変更のあった箇所のみ ChangeSet の再生成することで処理を効率化する仕組みです。
Typeprof への貢献を考えている方向け (Good first issue)
セッションの最後では Typeprof への貢献を考えている人向けに、貢献ができる部分をレベル別で紹介されていました。 本記事でも、いくつか抜粋して紹介します。
Level 1
- 不足しているテストシナリオの追加
- 足りていない Ruby/RBS の仕様のサポート
- 型推論の CLI ツールの作成
Level 2
- エラーメッセージの改善
- 変数の定義ジャンプを可能にする
Level 3
- 補完をより賢くする
- フロー解析の改善
- ruby-lsp のサポート
- rbs inline のサポート
感想
今回初めて RubyKaigi に参加してみて、Ruby に関わる方々の技術レベルに圧倒されるとともに、コミュニティの方々が心の底からプログラミングを楽しんでいるのが伝わってきて素晴らしいと思いました。
自分は今回聴いているだけでしたが、いずれは Ruby のコミュニティ側で参加したいですね。 時間があるときに、Typeprof への貢献にも挑戦してみようと思います。
最後になりますが、Ruby Official Party で mametter さんと ツーショット写真を撮らせて頂いたので掲載します(ありがとうございました!!)。
Techouse では、社会課題の解決に一緒に取り組むエンジニアを募集しております。 ご応募お待ちしております。 jp.techouse.com