`Lint/OrderedMagicComments` copを実装した

znz さんが開いてくれた Issue をもとに2日くらい前に実装した Lint/OrderedMagicComments cop がマージされた。次の RuboCop のリリースで足されると思う。

github.com

サンプル (もとは Issue) からの抜粋が Cop の説明になると思う。

#
#   # bad
#
#   # frozen_string_literal: true
#   # encoding: ascii
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:UTF-8>]
#
#   # good
#
#   # encoding: ascii
#   # frozen_string_literal: true
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
#
#   # good
#
#   #!/usr/bin/env ruby
#   # encoding: ascii
#   # frozen_string_literal: true
#   p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
#

マジックコメントの順序で結果が変わるのはなるほどだったので、また少し Ruby 詳しくなれた。

ちなみにこの Cop を実装しようと思った時に、ファイルのどの範囲までマジックコメントを探すようにするかが懸念点だったけれど、frozen_string_literal マジックコメントまわりの Cop 実装についてコードリーディングしている中で FrozenStringLiteral#leading_comment_lines メソッドを見つけたときに懸念が解消した感があってそれを使っている。

def leading_comment_lines
  processed_source[0..2].compact
end