From 2a80427755099c17e84652308afd1719f8efc766 Mon Sep 17 00:00:00 2001 From: Seeker Date: Fri, 8 Jan 2021 00:17:48 -0800 Subject: [PATCH] unless_multiple_conditions: add autocorrect --- .../rubocops/unless_multiple_conditions.rb | 19 +++++- .../unless_multiple_conditions_spec.rb | 60 ++++++++++++++++++- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/Library/Homebrew/rubocops/unless_multiple_conditions.rb b/Library/Homebrew/rubocops/unless_multiple_conditions.rb index 2e025586e8..0ad8a15602 100644 --- a/Library/Homebrew/rubocops/unless_multiple_conditions.rb +++ b/Library/Homebrew/rubocops/unless_multiple_conditions.rb @@ -14,7 +14,24 @@ module RuboCop sig { params(node: RuboCop::AST::IfNode).void } def on_if(node) - add_offense(node) if node.unless? && (node.condition.and_type? || node.condition.or_type?) + return if !node.unless? || (!node.condition.and_type? && !node.condition.or_type?) + + add_offense(node, location: node.condition.source_range.with(begin_pos: node.loc.keyword.begin_pos)) + end + + sig { params(node: RuboCop::AST::IfNode).returns(T.proc.params(arg0: RuboCop::Cop::Corrector).void) } + def autocorrect(node) + lambda do |corrector| + corrector.replace(node.loc.keyword, "if") + corrector.replace(node.condition.loc.operator, node.condition.inverse_operator) + [node.condition.lhs, node.condition.rhs].each do |subcondition| + if !subcondition.source.start_with?("(") || !subcondition.source.end_with?(")") + corrector.insert_before(subcondition, "(") + corrector.insert_after(subcondition, ")") + end + corrector.insert_before(subcondition, "!") + end + end end end end diff --git a/Library/Homebrew/test/rubocops/unless_multiple_conditions_spec.rb b/Library/Homebrew/test/rubocops/unless_multiple_conditions_spec.rb index c68bd17a5b..186c419044 100644 --- a/Library/Homebrew/test/rubocops/unless_multiple_conditions_spec.rb +++ b/Library/Homebrew/test/rubocops/unless_multiple_conditions_spec.rb @@ -16,7 +16,7 @@ describe RuboCop::Cop::Style::UnlessMultipleConditions do expect_offense <<~RUBY something unless foo && bar - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions. + ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions. RUBY end @@ -30,7 +30,7 @@ describe RuboCop::Cop::Style::UnlessMultipleConditions do expect_offense <<~RUBY something unless foo || bar - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions. + ^^^^^^^^^^^^^^^^^ Avoid using `unless` with multiple conditions. RUBY end @@ -69,4 +69,60 @@ describe RuboCop::Cop::Style::UnlessMultipleConditions do something unless foo RUBY end + + it "auto-corrects `unless` with multiple `and` conditions" do + source = <<~RUBY + unless foo && (bar || baz) + something + end + RUBY + + corrected_source = <<~RUBY + if !(foo) || !(bar || baz) + something + end + RUBY + + new_source = autocorrect_source(source) + expect(new_source).to eq(corrected_source) + + source = <<~RUBY + something unless foo && bar + RUBY + + corrected_source = <<~RUBY + something if !(foo) || !(bar) + RUBY + + new_source = autocorrect_source(source) + expect(new_source).to eq(corrected_source) + end + + it "auto-corrects `unless` with multiple `or` conditions" do + source = <<~RUBY + unless foo || (bar && baz) + something + end + RUBY + + corrected_source = <<~RUBY + if !(foo) && !(bar && baz) + something + end + RUBY + + new_source = autocorrect_source(source) + expect(new_source).to eq(corrected_source) + + source = <<~RUBY + something unless foo || bar + RUBY + + corrected_source = <<~RUBY + something if !(foo) && !(bar) + RUBY + + new_source = autocorrect_source(source) + expect(new_source).to eq(corrected_source) + end end