2019-12-31
gemが潰したはずのRubyの警告を吐いてて「きさま、倒したはずじゃ…?!」と思ったら、rbenvでそのディレクトリで管理されているRubyのバージョンで、警告が直ったgemをインストールしていないだけだった。
今日も型を見ている。
昨日Issueにした、キーワードと同名の引数名を定義できない問題を、エスケープを入れることで直した。
これを実装していたら、キーワードを末尾に含むようなメソッド名が不必要にescapeされているのに気がついて直した。
class C # "out"がキーワードなので、それを末尾に含む"timeout"までエスケープされてしまう def `timeout`: () -> Integer end
これめっちゃむずかった。 PRを見ると簡単そうに見えるのだけど、そもそもSteepがコケているというところから、「なぜか定義されていないはずのクラスをresolveできてしまっている」というのにたどり着いて、それを直すまでがかなり大変だった。
rbs prototype rb
コマンドがclass << self
構文をサポートしていなかったのでサポートした。
これはクラスメソッドとインスタンスメソッドで同名のメソッドを持っているクラスがあって、メソッドが重複していると怒られたので気がついた。
class C class << self def m() end end def m() end end
上のクラス定義から型定義を生成しようとすると次のようになってしまう
class C def m: () -> untyped def m: () -> untyped end
このPRによって次のようになる
class C def self.m: () -> untyped def m: () -> untyped end
Kibelaに型を入れるのは、つぎのような感じですすんでいる
- Rubyコードから型のprototypeを生成
- untypedだらけの型定義が手に入る
- クラス名やメソッド名の重複があったりするので適当に倒していく
- クラス名は雑にmergeした
- メソッド名の重複だと思っていたやつは、
class << self
をサポートしたら解決した。 https://github.com/ruby/ruby-signature/pull/157
- ActiveRecordの持っている情報を使って、カラムをattr_accessorの型として定義する
- これはprototypeで生成したやつのextensionとして生成している。
- Steepを走らせてはバグを潰していく
- stack overflow https://github.com/ruby/ruby-signature/pull/158
- これはなかなか高難易度だった
- 今はcache周りのエラーを倒している…
- とりあえずパッチはできた。正しいのかよくわからないけど、明日きれいにしてPull Requestにする
- あとは知らない型があると落ちるので、それを適当に無の型をつけていく。
class ActionController::Base end
みたいなのをひたすら書いていく- これはライブラリの型を手に入れればいい感じになるはずですね
- stack overflow https://github.com/ruby/ruby-signature/pull/158
という感じ。
なんと頑張った結果KibelaのRails appでSteepが例外を吐かずに完走するところまで持っていくことができた。じぶんえらい!
実行に6分ぐらいかかっていて、型エラーは6500個ぐらい出ている。まあこれは型が全然足りていないから仕方がない。
るりまレビュー会やった
https://rurema-review.connpass.com/event/160758/
S-H-GAMELINKSさんが出しているCのサンプルコード、良い取り組みだと思うのだけど、Cが全然わからないのでレビューがむずかしい。 Cが分かる人に任せたい。(放置され続けたらレビューします…)
るりまのRuby 2.7変更対応は、誰かがやらないと誰もやらないかなと思って1つPRを出してみた。🐧 簡単なやつも多いと思うので、取り組んでもらえるとうれしいです。
これを読んで実際に使ってくれる人がvim-jpまわりでちょこちょこいて嬉しい。