class RuboCop::Cop::Lint::UnreachableCode
end
do_something
def some_method
# good
@example
end
do_something
end
return
else
return
if cond
def some_method
# bad
end
do_something
return
def some_method
# bad
@example
statement in non-final position in ‘begin` (implicit) blocks.
The check are based on the presence of flow of control
Checks for unreachable code.
def check_case(node)
def check_case(node) else_branch = node.else_branch return false unless else_branch return false unless flow_expression?(else_branch) node.when_branches.all? { |branch| branch.body && flow_expression?(branch.body) } end
def check_if(node)
def check_if(node) if_branch = node.if_branch else_branch = node.else_branch if_branch && else_branch && flow_expression?(if_branch) && flow_expression?(else_branch) end
def flow_expression?(node)
def flow_expression?(node) return true if flow_command?(node) case node.type when :begin, :kwbegin expressions = *node expressions.any? { |expr| flow_expression?(expr) } when :if check_if(node) when :case check_case(node) else false end end
def on_begin(node)
def on_begin(node) expressions = *node expressions.each_cons(2) do |expression1, expression2| next unless flow_expression?(expression1) add_offense(expression2) end end