class RuboCop::Cop::Lint::ElseLayout

This cop checks for odd else block layout - like having an expression on the same line as the else keyword, which is usually a mistake.

@example

if something
  ...
else do_this
  do_that
end

Public Instance Methods

on_if(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 18
def on_if(node)
  # ignore ternary ops
  return if node.loc.respond_to?(:question)
  # ignore modifier ops & elsif nodes
  return unless node.loc.end

  check(node)
end

Private Instance Methods

check(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 29
def check(node)
  return unless node
  return check_else(node) if else?(node)

  check_if(node) if if?(node)
end
check_else(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 36
def check_else(node)
  _cond, _if_branch, else_branch = *node
  return unless else_branch && else_branch.type == :begin

  first_else_expr = else_branch.children.first
  return unless first_else_expr.source_range.line == node.loc.else.line

  add_offense(first_else_expr, :expression, message)
end
check_if(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 46
def check_if(node)
  _cond, _if_branch, else_branch = *node
  check(else_branch)
end
else?(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 56
def else?(node)
  node.loc.respond_to?(:else) && node.loc.else &&
    node.loc.else.is?('else')
end
if?(node) click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 51
def if?(node)
  node.loc.respond_to?(:keyword) &&
    %w(if elsif).include?(node.loc.keyword.source)
end
message() click to toggle source
# File lib/rubocop/cop/lint/else_layout.rb, line 61
def message
  'Odd `else` layout detected. Did you mean to use `elsif`?'
end