diary

I like Hatena Star with a text selection.

2020-12-31

github.com

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では...が使えないから対応しなくてよかった。 るりまのドキュメントの方は直したい気がする。


github.com

github.com

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になっているので、アップデートは多少やることがある。 まあまだ非互換バンバン入れていっていいでしょという気持ち。


github.com

rbs prototype rbでarguments forwarding syntaxがうまく動かないという報告が来ていたので直した。 これruntimeで同様の問題を直した時に気がついておきたかった…。

あんまりruby/rbsのissue見てなくてちょっと放置してしまった。


github.com

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