RubocopとParserの関係
今日遭遇した問題に対応するのに、RubocopとParserの関係がよくわかっていなくて混乱したのでメモ。
rubocop?
github.com こっちはみんな知ってると思いますがruby用の静的解析ツールです。
Parser
rubyで書かれたrubyのパーサーです。rubyのソースコードを読み込みASTを作ります。rubocopの内部で利用されています。 rubocopが利用しているParserのバージョンは -Vオプションで表示できます
rubocop -V > 0.52.0 (using Parser 2.5.0.2, running on ruby 2.4.1 x86_64-darwin16)
今回遭遇した問題
ある日突然SideCIでだけrubocopのエラーが検出されるようになりました
Lint/Syntax: unexpected token tRCURLY (Using Ruby 2.4 parser; configure using TargetRubyVersion parameter, under AllCops)
のようなエラーです。 SideCIに問い合わせてみたところ、Parserのバージョンの可能性を教えてもらい確認してみたところ手元の環境でも再現し、問題を特定することができました。
Parserは、Ruby2.5系に対応するためにバージョンアップしており、SideCIは2.5系のコードを解析するためにParserのバージョンアップが必須。手元の環境はGemfileでParserのバージョン指定していなかったので古いになっててエラー検出されず、という状態でした。
対応
結局できることはなくて、様子見になっています。
Parserにはissue報告済み。修正できるならやってみようと思ったのですが、Rubyのパース処理は僕の理解を超えてました。同じような報告が過去にいくつかあがっててメンテナンス大変そうです。
unexpected token tLCURLY at 2.5.0.2 · Issue #454 · whitequark/parser · GitHub
SideCIには、Parserのバージョンを利用者側で指定できるようにしたいっていう要望を伝えたところ検討してもらえるようでした。
Lint/Syntax 系のエラーはrubocopではなくparser由来のものってところだけ覚えておくと、色々対応できると思います。 http://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Lint/Syntax