RuboCop 1.67.0 の目玉機能

RuboCop 1.67.0 がリリースされました。

github.com

多くはバグ修正などの改善となりますが、その中でも個人的に今回の目玉機能と思っているのは以下の3つです。

この記事では、それぞれについてざっくり記しておきます。

RBS::Inline 形式のコメントを許可するオプションを提供した

@tk0miya さんによる RBS::Inline 対応のパッチ三部作です。

github.com

github.com

github.com

RBS::Inline での attr_reader :name #: String といったコメント形式 #: を受け入れるオプションを提供しました。

先日の Rubyセミナー 東京で神速さんが「RBS::Inline 対応へのパッチが RuboCop に出ている」と話していたもののリリースという位置付けにもなります。

www.ruby.or.jp

これでコメント行の開始を表す # の後ろにスペースを強制するため #: を記述できないといった問題を解決できるようになったと思います。

サーバーモードで .rubocop.yml と .rubocop_todo.yml を変更検知するようにした

これまで rubocop --server といったサーバーモードが自動で再起動するように検知していたのは、RuboCop 自身のバージョン変更と Gemfile.lock の更新のみでしたが、いくらかの RuboCop の構成変更にも対応するよう .rubocop.yml と .rubocop_todo.yml の変更も検知できるようにしました。

これはいくつかの LSP クライアントは、.rubocop.yml と .rubocop_todo.yml の変更を検知してサーバー再起動をできるようにしているのと同様の機能提供となります。思っているよりもサーバーモードは使われていそうなのと、それによるキャッシュの弊害というのはありそうなので対応しておきました。

Lint/SafeNavigationConsistency cop を仕様変更した

いつか見直そうと思っていた Lint/SafeNavigationConsistency cop について仕様変更しました。実装も先月個人旅行で鹿児島に足を運んだ際の飛行機でスクラッチしました。

これまでは x&.foo && x.bar といった xnil でないであろうことが自明なケースでも x&.foo && x&.bar常に safe navigation を使うよう一貫させるのを強制するものでした。しかも Lint という部署で冗長な safe navigation を強制的に書かせられるのは厳しい。

今回のリリースで x&.foo && x&.bar のようなケースは、最初の条件の xnil でない前提とできるなら、後ろの条件は safe navigation をしない x&.foo && x.bar とする。一方で x&.foo || x.bar のような最初の条件が nil の可能性があるなら、後の条件にも safe navigation した x&.foo || x&.bar とする。つまり safe navigation の利用を過不足ないよう一貫させるという仕様にしました。Cop の名称変更や部署変更は breaking change なので容易にできず、一貫の意味を変えるという苦肉の策。

いずれにしても、これで不要な safe navigation を強制させてくることはなくなったと思います。

以上が 1.67.0 の主だった変更です。リリース後の状況としては、とりわけ Lint/SafeNavigationConsistency cop の仕様変更によって、他の Cop のバグが見つかってきている (おかしな仕様だったせいで、まわりも色々とおかしくしていたらしい) ようなので、次のリリースではそのあたりの修正が入っていく予定です。

そんな感じで今日はここまで。ハックを続けましょう。