diff --git a/changelog/fix_false_autocorrection_for_layout_end_alignment.md b/changelog/fix_false_autocorrection_for_layout_end_alignment.md new file mode 100644 index 00000000000..630a73469fc --- /dev/null +++ b/changelog/fix_false_autocorrection_for_layout_end_alignment.md @@ -0,0 +1 @@ +* [#9928](https://github.com/rubocop/rubocop/issues/9928): Fix an infinite loop error and a false auto-correction behavior for `Layout/EndAlignment` when using operator methods and `EnforcedStyleAlignWith: variable`. ([@koic][]) diff --git a/lib/rubocop/cop/layout/end_alignment.rb b/lib/rubocop/cop/layout/end_alignment.rb index f5d12d12543..07c58af1df4 100644 --- a/lib/rubocop/cop/layout/end_alignment.rb +++ b/lib/rubocop/cop/layout/end_alignment.rb @@ -167,7 +167,8 @@ def alignment_node(node) def alignment_node_for_variable_style(node) return node.parent if node.case_type? && node.argument? - assignment = node.ancestors.find(&:assignment_or_similar?) + assignment = assignment_or_operator_method(node) + if assignment && !line_break_before_keyword?(assignment.source_range, node) assignment else @@ -177,6 +178,12 @@ def alignment_node_for_variable_style(node) node end end + + def assignment_or_operator_method(node) + node.ancestors.find do |ancestor| + ancestor.assignment_or_similar? || ancestor.send_type? && ancestor.operator_method? + end + end end end end diff --git a/spec/rubocop/cop/layout/end_alignment_spec.rb b/spec/rubocop/cop/layout/end_alignment_spec.rb index b6a5e716a5e..a7d3d5f8285 100644 --- a/spec/rubocop/cop/layout/end_alignment_spec.rb +++ b/spec/rubocop/cop/layout/end_alignment_spec.rb @@ -301,6 +301,44 @@ module Test include_examples 'aligned', 'puts 1; while', 'Test', ' end' include_examples 'aligned', 'puts 1; until', 'Test', ' end' include_examples 'aligned', 'puts 1; case', 'a when b', ' end' + + it 'register an offense when using `+` operator method and `end` is not aligned' do + expect_offense(<<~RUBY) + variable + if condition + foo + else + bar + end + ^^^ `end` at 5, 11 is not aligned with `variable + if` at 1, 0. + RUBY + + expect_correction(<<~RUBY) + variable + if condition + foo + else + bar + end + RUBY + end + + it 'register an offense when using `-` operator method and `end` is not aligned' do + expect_offense(<<~RUBY) + variable - if condition + foo + else + bar + end + ^^^ `end` at 5, 11 is not aligned with `variable - if` at 1, 0. + RUBY + + expect_correction(<<~RUBY) + variable - if condition + foo + else + bar + end + RUBY + end end context 'correct + opposite' do