36 lines
1.2 KiB
Ruby
36 lines
1.2 KiB
Ruby
# typed: strict
|
|
# frozen_string_literal: true
|
|
|
|
module RuboCop
|
|
module Cop
|
|
module Style
|
|
# This cop checks that `unless` is not used with multiple conditions.
|
|
#
|
|
# @api private
|
|
class UnlessMultipleConditions < Base
|
|
extend T::Sig
|
|
extend AutoCorrector
|
|
|
|
MSG = "Avoid using `unless` with multiple conditions."
|
|
|
|
sig { params(node: RuboCop::AST::IfNode).void }
|
|
def on_if(node)
|
|
return if !node.unless? || (!node.condition.and_type? && !node.condition.or_type?)
|
|
|
|
add_offense(node.condition.source_range.with(begin_pos: node.loc.keyword.begin_pos)) 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
|
|
end
|
|
end
|