Class: RuboCop::Cop::Style::MultipleComparison

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/style/multiple_comparison.rb

Overview

Checks against comparing a variable with multiple items, where Array#include?, Set#include? or a case could be used instead to avoid code repetition. It accepts comparisons of multiple method calls to avoid unnecessary method calls by default. It can be configured by AllowMethodComparison option.

Examples:

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

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

VALUES = Set['a', 'b', 'c'].freeze
# elsewhere...
foo if VALUES.include?(a)

case foo
when 'a', 'b', 'c' then foo
# ...
end

# accepted (but consider `case` as above)
foo if a == b.lightweight || a == b.heavyweight

AllowMethodComparison: true (default)

# good
foo if a == b.lightweight || a == b.heavyweight

AllowMethodComparison: false

# bad
foo if a == b.lightweight || a == b.heavyweight

# good
foo if [b.lightweight, b.heavyweight].include?(a)

ComparisonsThreshold: 2 (default)

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

ComparisonsThreshold: 3

# good
foo if a == 'a' || a == 'b'

Constant Summary collapse

MSG =
'Avoid comparing a variable with multiple items ' \
'in a conditional, use `Array#include?` instead.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#on_new_investigationObject



58
59
60
# File 'lib/rubocop/cop/style/multiple_comparison.rb', line 58

def on_new_investigation
  @last_comparison = nil
end

#on_or(node) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/rubocop/cop/style/multiple_comparison.rb', line 62

def on_or(node)
  reset_comparison if switch_comparison?(node)

  root_of_or_node = root_of_or_node(node)

  return unless node == root_of_or_node
  return unless nested_variable_comparison?(root_of_or_node)
  return if @allowed_method_comparison
  return if @compared_elements.size < comparisons_threshold

  add_offense(node) do |corrector|
    elements = @compared_elements.join(', ')
    prefer_method = "[#{elements}].include?(#{variables_in_node(node).first})"

    corrector.replace(node, prefer_method)
  end

  @last_comparison = node
end