class RuboCop::Cop::Style::MultipleComparison

This cop checks against comparing a variable with multiple items, where `Array#include?` could be used instead to avoid code repetition.

@example

# bad
a = 'a'
foo if a == 'a' || a == 'b' || a == 'c'

# good
a = 'a'
foo if ['a', 'b', 'c'].include?(a)

Constants

MSG

Public Instance Methods

on_if(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 20
def on_if(node)
  return unless nested_variable_comparison?(node.condition)
  add_offense(node)
end

Private Instance Methods

comparison?(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 70
def comparison?(node)
  simple_comparison?(node) || nested_comparison?(node)
end
nested_comparison?(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 62
def nested_comparison?(node)
  if node.or_type?
    node.node_parts.all? { |node_part| comparison? node_part }
  else
    false
  end
end
nested_variable_comparison?(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 33
def nested_variable_comparison?(node)
  return false unless nested_comparison?(node)
  variables_in_node(node).count == 1
end
variable_name(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 58
def variable_name(node)
  node.children[0]
end
variables_in_node(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 38
def variables_in_node(node)
  if node.or_type?
    node.node_parts
        .flat_map { |node_part| variables_in_node(node_part) }
        .uniq
  else
    variables_in_simple_node(node)
  end
end
variables_in_simple_node(node) click to toggle source
# File lib/rubocop/cop/style/multiple_comparison.rb, line 48
def variables_in_simple_node(node)
  simple_double_comparison?(node) do |var1, var2|
    return [variable_name(var1), variable_name(var2)]
  end
  simple_comparison?(node) do |var|
    return [variable_name(var)]
  end
  []
end