Class: RuboCop::Cop::Lint::DuplicateBranch

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/lint/duplicate_branch.rb

Overview

Checks that there are no repeated bodies within ‘if/unless`, `case-when`, `case-in` and `rescue` constructs.

With ‘IgnoreLiteralBranches: true`, branches are not registered as offenses if they return a basic literal value (string, symbol, integer, float, rational, complex, `true`, `false`, or `nil`), or return an array, hash, regexp or range that only contains one of the above basic literal values.

With ‘IgnoreConstantBranches: true`, branches are not registered as offenses if they return a constant value.

With ‘IgnoreDuplicateElseBranch: true`, in conditionals with multiple branches, duplicate ’else’ branches are not registered as offenses.

Examples:

# bad
if foo
  do_foo
  do_something_else
elsif bar
  do_foo
  do_something_else
end

# good
if foo || bar
  do_foo
  do_something_else
end

# bad
case x
when foo
  do_foo
when bar
  do_foo
else
  do_something_else
end

# good
case x
when foo, bar
  do_foo
else
  do_something_else
end

# bad
begin
  do_something
rescue FooError
  handle_error
rescue BarError
  handle_error
end

# good
begin
  do_something
rescue FooError, BarError
  handle_error
end

IgnoreLiteralBranches: true

# good
case size
when "small" then 100
when "medium" then 250
when "large" then 1000
else 250
end

IgnoreConstantBranches: true

# good
case size
when "small" then SMALL_SIZE
when "medium" then MEDIUM_SIZE
when "large" then LARGE_SIZE
else MEDIUM_SIZE
end

IgnoreDuplicateElseBranch: true

# good
if foo
  do_foo
elsif bar
  do_bar
else
  do_foo
end

Constant Summary collapse

MSG =
'Duplicate branch body detected.'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

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

#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_branching_statement(node) ⇒ Object Also known as: on_case, on_case_match, on_rescue



102
103
104
105
106
107
108
109
# File 'lib/rubocop/cop/lint/duplicate_branch.rb', line 102

def on_branching_statement(node)
  branches = branches(node)
  branches.each_with_object(Set.new) do |branch, previous|
    next unless consider_branch?(branches, branch)

    add_offense(offense_range(branch)) unless previous.add?(branch)
  end
end

#on_if(node) ⇒ Object



114
115
116
117
118
# File 'lib/rubocop/cop/lint/duplicate_branch.rb', line 114

def on_if(node)
  # Ignore 'elsif' nodes, because we don't want to check them separately whether
  # the 'else' branch is duplicated. We want to check only on the outermost conditional.
  on_branching_statement(node) unless node.elsif?
end