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