class RuboCop::Cop::Style::IdenticalConditionalBranches
This cop checks for identical lines at the beginning or end of each branch of a conditional statement.
@example
# bad if condition do_x do_z else do_y do_z end # good if condition do_x else do_y end do_z # bad if condition do_z do_x else do_z do_y end # good do_z if condition do_x else do_y end # bad case foo when 1 do_x when 2 do_x else do_x end # good case foo when 1 do_x do_y when 2 # nothing else do_x do_z end
Constants
- MSG
Public Instance Methods
on_case(node)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 75 def on_case(node) return unless node.else? && node.else_branch branches = node.when_branches.map(&:body).push(node.else_branch) check_branches(branches) end
on_if(node)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 68 def on_if(node) return if node.elsif? branches = expand_elses(node.else_branch).unshift(node.if_branch) check_branches(branches) end
Private Instance Methods
check_branches(branches)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 84 def check_branches(branches) # return if any branch is empty. An empty branch can be an `if` # without an `else` or a branch that contains only comments. return if branches.any?(&:nil?) tails = branches.map { |branch| tail(branch) } check_expressions(tails) if tails.none?(&:nil?) heads = branches.map { |branch| head(branch) } check_expressions(heads) if tails.none?(&:nil?) end
check_expressions(expressions)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 95 def check_expressions(expressions) return unless expressions.size > 1 && expressions.uniq.one? expressions.each do |expression| add_offense(expression) end end
expand_elses(branch)
click to toggle source
`elsif` branches show up in the if node as nested `else` branches. We need to recursively iterate over all `else` branches.
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 109 def expand_elses(branch) if branch.nil? [nil] elsif branch.if_type? _condition, elsif_branch, else_branch = *branch expand_elses(else_branch).unshift(elsif_branch) else [branch] end end
head(node)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 124 def head(node) node.begin_type? ? node.children.first : node end
message(node)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 103 def message(node) format(MSG, source: node.source) end
tail(node)
click to toggle source
# File lib/rubocop/cop/style/identical_conditional_branches.rb, line 120 def tail(node) node.begin_type? ? node.children.last : node end