diary

I like Hatena Star with a text selection.

2019-12-31

gemが潰したはずのRubyの警告を吐いてて「きさま、倒したはずじゃ…?!」と思ったら、rbenvでそのディレクトリで管理されているRubyのバージョンで、警告が直ったgemをインストールしていないだけだった。


今日も型を見ている。

github.com

昨日Issueにした、キーワードと同名の引数名を定義できない問題を、エスケープを入れることで直した。

これを実装していたら、キーワードを末尾に含むようなメソッド名が不必要にescapeされているのに気がついて直した。

class C
  # "out"がキーワードなので、それを末尾に含む"timeout"までエスケープされてしまう
  def `timeout`: () -> Integer
end

github.com

これめっちゃむずかった。 PRを見ると簡単そうに見えるのだけど、そもそもSteepがコケているというところから、「なぜか定義されていないはずのクラスをresolveできてしまっている」というのにたどり着いて、それを直すまでがかなり大変だった。


github.com

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だらけの型定義が手に入る
    • クラス名やメソッド名の重複があったりするので適当に倒していく
  • ActiveRecordの持っている情報を使って、カラムをattr_accessorの型として定義する
    • これはprototypeで生成したやつのextensionとして生成している。
  • Steepを走らせてはバグを潰していく
    • stack overflow https://github.com/ruby/ruby-signature/pull/158
      • これはなかなか高難易度だった
    • 今はcache周りのエラーを倒している…
      • とりあえずパッチはできた。正しいのかよくわからないけど、明日きれいにしてPull Requestにする
    • あとは知らない型があると落ちるので、それを適当に無の型をつけていく。
      • class ActionController::Base endみたいなのをひたすら書いていく
      • これはライブラリの型を手に入れればいい感じになるはずですね

という感じ。

なんと頑張った結果KibelaRails appでSteepが例外を吐かずに完走するところまで持っていくことができた。じぶんえらい!

実行に6分ぐらいかかっていて、型エラーは6500個ぐらい出ている。まあこれは型が全然足りていないから仕方がない。


るりまレビュー会やった

https://rurema-review.connpass.com/event/160758/

S-H-GAMELINKSさんが出しているCのサンプルコード、良い取り組みだと思うのだけど、Cが全然わからないのでレビューがむずかしい。 Cが分かる人に任せたい。(放置され続けたらレビューします…)

github.com

るりまのRuby 2.7変更対応は、誰かがやらないと誰もやらないかなと思って1つPRを出してみた。🐧 簡単なやつも多いと思うので、取り組んでもらえるとうれしいです。


pocke.hatenablog.com

これを読んで実際に使ってくれる人がvim-jpまわりでちょこちょこいて嬉しい。