Class: RuboCop::Cop::Lint::MultipleComparison
- Extended by:
- AutoCorrector
- Defined in:
- lib/rubocop/cop/lint/multiple_comparison.rb
Overview
In math and Python, we can use ‘x < y < z` style comparison to compare multiple value. However, we can’t use the comparison in Ruby. However, the comparison is not syntax error. This cop checks the bad usage of comparison operators.
Constant Summary collapse
- MSG =
'Use the `&&` operator to compare multiple values.'
- COMPARISON_METHODS =
%i[< > <= >=].freeze
- SET_OPERATION_OPERATORS =
%i[& | ^].freeze
- RESTRICT_ON_SEND =
COMPARISON_METHODS
Instance Attribute Summary
Attributes inherited from Base
Instance Method Summary collapse
Methods included from AutoCorrector
Methods inherited from Base
#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #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_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version
Methods included from ExcludeLimit
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
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#multiple_compare?(node) ⇒ Object
29 30 31 |
# File 'lib/rubocop/cop/lint/multiple_comparison.rb', line 29 def_node_matcher :multiple_compare?, <<~PATTERN (send (send _ {:< :> :<= :>=} $_) {:#{COMPARISON_METHODS.join(' :')}} _) PATTERN |
#on_send(node) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/rubocop/cop/lint/multiple_comparison.rb', line 33 def on_send(node) return unless (center = multiple_compare?(node)) # It allows multiple comparison using `&`, `|`, and `^` set operation operators. # e.g. `x >= y & y < z` return if center.send_type? && SET_OPERATION_OPERATORS.include?(center.method_name) add_offense(node) do |corrector| new_center = "#{center.source} && #{center.source}" corrector.replace(center, new_center) end end |