先月のパッチ会で @osyo-manga さんが、Fukuoka.rb 200回 LT 大会 (だったと思う) あたりで話題に上がっていたらしい RuboCop のバグに関するパッチ話を持ってきてくれて、その流れで後日 PR を開いてくれた以下の修正パッチが目玉。
問題としては、日本語のようなマルチバイト圏で、RuboCop の警告ハイライト範囲に誤差が出るというものだった。問題のサンプルとして、以下のコード例に対する修正される前と後の振る舞いです。
% cat example.rb { "あいうえお" => value, "かきくけこ" => value }
Before
マルチバイト文字が関わった警告ハイライトがずれている。
% rubocop -v 1.12.0 % rubocop example.rb Inspecting 1 file C Offenses: example.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment. { ^ example.rb:2:3: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols. "あいうえお" => value, ^^^^^^^ example.rb:3:3: C: [Correctable] Layout/HashAlignment: Align the keys of a hash literal if they span more than one line. "かきくけこ" => value ^^^^^^^^^^^^^^^^^^ example.rb:3:3: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols. "かきくけこ" => value ^^^^^^^ example.rb:3:13: C: [Correctable] Layout/SpaceAroundOperators: Operator => should be surrounded by a single space. "かきくけこ" => value ^^ 1 file inspected, 5 offenses detected, 5 offenses auto-correctable
After
マルチバイト文字を考慮した警告ハイライトになっている。 (注: デザインの関係でこの記事ではずれていますが、ターミナルで期待しているハイライトがされていることを確認できます。)
% rubocop -v 1.12.1 % rubocop example.rb Inspecting 1 file C Offenses: example.rb:1:1: C: [Correctable] Style/FrozenStringLiteralComment: Missing frozen string literal comment. { ^ example.rb:2:3: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols. "あいうえお" => value, ^^^^^^^^^^^^ example.rb:3:3: C: [Correctable] Layout/HashAlignment: Align the keys of a hash literal if they span more than one line. "かきくけこ" => value ^^^^^^^^^^^^^^^^^^^^^^^ example.rb:3:3: C: [Correctable] Style/StringLiterals: Prefer single-quoted strings when you don't need string interpolation or special symbols. "かきくけこ" => value ^^^^^^^^^^^^ example.rb:3:13: C: [Correctable] Layout/SpaceAroundOperators: Operator => should be surrounded by a single space. "かきくけこ" => value ^^ 1 file inspected, 5 offenses detected, 5 offenses auto-correctable
Unicode::DisplayWidth
gem というキャラクターの文字表示幅を見てくれる gem があって、RuboCop ではそういったマルチバイト文字の処理を行う際に使っているのですが、ユーザーに表示するフォーマッター部分で使われていなかったことが原因でした。
@osyo-manga さんパッチありがとうござました!
そのほか、RuboCop 1.12.1 の変更履歴は以下です。
それではハックを続けましょう。