2020-12-31
RBS Railsで、scopeの定義からRBSを生成する際に、考慮が足りていなかった引数の種類があったので直した。
こういう時にるりまの「すべての種類の引数を持つメソッド定義」が便利。 https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#method
def f(a, b, c, m = 1, n = 1, *rest, x, y, z, k: 1, **kwrest, &blk)
そういえば...
の対応はしなくていいんだっけ、と思ったけど、scopeで使うlambadaでは...
が使えないから対応しなくてよかった。
るりまのドキュメントの方は直したい気がする。
RBS Railsで持っていた型定義をgem_rbsの方に寄せた。
主な目的としては、Rails以外のプロジェクトで「activesupportの型定義だけ使いたい」みたいな需要に応えるため。 今まではそういうケースでもRBS Railsに同梱されている型定義が必要だったのだけど、gem_rbsだけで事足りるようにした。
ただ(型定義上での)Railsの各Gemの依存関係が難しくて、「activerecordだけ使いたい」みたいなのはむずい。railtiesとの相互依存があるので、actionpackとかの他のgemもぞろそろ入ってきてしまう。まあrbs_rails gemはこの変更で必要なくなったので多少マシにはなった。
上2つを含んだRBS Rails v0.8.0をリリースした。 https://twitter.com/p_ck_/status/1344650177152385027 一応微妙にbreaking changeになっているので、アップデートは多少やることがある。 まあまだ非互換バンバン入れていっていいでしょという気持ち。
rbs prototype rb
でarguments forwarding syntaxがうまく動かないという報告が来ていたので直した。
これruntimeで同様の問題を直した時に気がついておきたかった…。
あんまりruby/rbsのissue見てなくてちょっと放置してしまった。
Ruby 3のendless method definitionでメソッド引数のカッコがなくて引数が空の時、RubyVM::AbstractSyntaxTree
でメソッド引数の情報が取れていなかったのを直した。
# これはok pp RubyVM::AbstractSyntaxTree.parse(<<~RUBY).children[2] def x() = 42 RUBY # => (DEFN@1:0-1:12 # mid: :x # body: # (SCOPE@1:0-1:12 # tbl: [] # args: # (ARGS@1:5-1:6 # pre_num: 0 # pre_init: nil # opt: nil # first_post: nil # post_num: 0 # post_init: nil # rest: nil # kw: nil # kwrest: nil # block: nil) # body: (LIT@1:10-1:12 42)))
# これは引数の情報が欠けてしまう pp RubyVM::AbstractSyntaxTree.parse(<<~RUBY).children[2] def x = 42 RUBY # => (DEFN@1:0-1:10 # mid: :x # body: (SCOPE@1:0-1:10 tbl: [] args: nil body: (LIT@1:8-1:10 42)))
これはruby/rbsに来ていたバグ報告を眺めていて気がついた。 https://github.com/ruby/rbs/issues/551