3連休2日目

東京に来ていた Dominion525 さんと晩御飯を食べながら、名古屋Ruby会議やソフトウェア開発についての話をしたりしていた。

RuboCop の話題になった際に、do ... end を文に { ... } を式に適用するという cop を作れないか浮かんだので、帰宅後に初手として仮説を立てていた AST を見てた (仮に実現したあと upstream に投げるとしてもデフォルト Enabled: false の類だといまのところ思っている) 。

require 'parser/current'

Parser::CurrentRuby.parse("foo { puts('hi') }")
=> s(:block,
  s(:send, nil, :foo),
  s(:args),
  s(:send, nil, :puts,
    s(:str, "hi")))

Parser::CurrentRuby.parse("foo do puts('hi') end")
=> s(:block,
  s(:send, nil, :foo),
  s(:args),
  s(:send, nil, :puts,
    s(:str, "hi")))

予想 (というか期待?) したとおり do ... end{ ... } の違いは S 式上で出てこないので、まずこの辺りの解決をしないと考えを先に進められなさそう。Parser::AST::Node#location あたりを使って頑張ることになるのだろうか。