class RuboCop::Cop::Lint::DuplicateMatchPattern
Checks that there are no repeated patterns used in ‘in` keywords.
@example
# bad case x in 'first' do_something in 'first' do_something_else end # good case x in 'first' do_something in 'second' do_something_else end # bad - repeated alternate patterns with the same conditions don't depend on the order case x in foo | bar first_method in bar | foo second_method end # good case x in foo | bar first_method in bar | baz second_method end # bad - repeated hash patterns with the same conditions don't depend on the order case x in foo: a, bar: b first_method in bar: b, foo: a second_method end # good case x in foo: a, bar: b first_method in bar: b, baz: c second_method end # bad - repeated array patterns with elements in the same order case x in [foo, bar] first_method in [foo, bar] second_method end # good case x in [foo, bar] first_method in [bar, foo] second_method end # bad - repeated the same patterns and guard conditions case x in foo if bar first_method in foo if bar second_method end # good case x in foo if bar first_method in foo if baz second_method end
Constants
- MSG
Public Instance Methods
on_case_match(case_node)
click to toggle source
# File lib/rubocop/cop/lint/duplicate_match_pattern.rb, line 97 def on_case_match(case_node) case_node.in_pattern_branches.each_with_object(Set.new) do |in_pattern_node, previous| pattern = in_pattern_node.pattern next if previous.add?(pattern_identity(pattern)) add_offense(pattern) end end
Private Instance Methods
pattern_identity(pattern)
click to toggle source
# File lib/rubocop/cop/lint/duplicate_match_pattern.rb, line 108 def pattern_identity(pattern) pattern_source = if pattern.hash_pattern_type? || pattern.match_alt_type? pattern.children.map(&:source).sort.to_s else pattern.source end return pattern_source unless (guard = pattern.parent.children[1]) pattern_source + guard.source end