Fix an infinite loop at autocorrect for Layout/CaseIndentation

このエントリーをはてなブックマークに追加

Fix an infinite loop at autocorrect for Layout/CaseIndentation
https://github.com/rubocop/rubocop/pull/10533

以下のrubocop.ymlがある状態で rubocop を走らせると無限ループに陥るケースがあった。

Layout/BeginEndAlignment:
  EnforcedStyleAlignWith: start_of_line
  AutoCorrect: true

Layout/CaseIndentation:
  EnforcedStyle: end

これは常に発生するわけではなく、エッジケースではあるのだが、次のコードのように、when と end が同じ行にあるときに発生していた。

# frozen_string_literal: true

case thing
when 3 then 1
when 2 then 2
else 3 end

Layout/CaseIndentationEnforcedStyle: end で、かつ、elseend と同じ行にある場合、 else のインデントを end のインデントと一致させようとするが同一行に存在する end とインデントを合わせられることはないので無限にLayout/CaseIndentationが走るという問題だった。

そこで、when or elseend と同じ行にあり、Layout/CaseIndentationEnforcedStyle: end の場合は、自動補正をしないように修正した。