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_gem_version, #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