class RuboCop::Cop::Layout::MultilineOperationIndentation

Checks the indentation of the right hand side operand in binary operations that span more than one line.

The ‘aligned` style checks that operators are aligned if they are part of an `if` or `while` condition, an explicit `return` statement, etc. In other contexts, the second operand should be indented regardless of enforced style.

@example EnforcedStyle: aligned (default)

# bad
if a +
    b
  something &&
  something_else
end

# good
if a +
   b
  something &&
    something_else
end

@example EnforcedStyle: indented

# bad
if a +
   b
  something &&
  something_else
end

# good
if a +
    b
  something &&
    something_else
end

Public Instance Methods

on_and(node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 49
def on_and(node)
  check_and_or(node)
end
on_or(node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 53
def on_or(node)
  check_and_or(node)
end
validate_config() click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 57
def validate_config
  return unless style == :aligned && cop_config['IndentationWidth']

  raise ValidationError, 'The `Layout/MultilineOperationIndentation` ' \
                         'cop only accepts an `IndentationWidth` ' \
                         'configuration parameter when ' \
                         '`EnforcedStyle` is `indented`.'
end

Private Instance Methods

autocorrect(corrector, node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 68
def autocorrect(corrector, node)
  AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
end
check_and_or(node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 78
def check_and_or(node)
  lhs, rhs = *node
  range = offending_range(node, lhs, rhs.source_range, style)
  check(range, node, lhs, rhs.source_range)
end
message(node, lhs, rhs) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 110
def message(node, lhs, rhs)
  what = operation_description(node, rhs)
  if should_align?(node, rhs, style)
    "Align the operands of #{what} spanning multiple lines."
  else
    used_indentation = rhs.column - indentation(lhs)
    "Use #{correct_indentation(node)} (not #{used_indentation}) " \
      "spaces for indenting #{what} spanning multiple lines."
  end
end
offending_range(node, lhs, rhs, given_style) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 84
def offending_range(node, lhs, rhs, given_style)
  return false unless begins_its_line?(rhs)
  return false if not_for_this_cop?(node)

  correct_column = if should_align?(node, rhs, given_style)
                     node.loc.column
                   else
                     indentation(lhs) + correct_indentation(node)
                   end
  @column_delta = correct_column - rhs.column
  rhs if @column_delta.nonzero?
end
relevant_node?(node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 72
def relevant_node?(node)
  return false if node.send_type? && node.unary_operation?

  !node.loc.dot # Don't check method calls with dot operator.
end
right_hand_side(send_node) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 121
def right_hand_side(send_node)
  send_node.first_argument.source_range
end
should_align?(node, rhs, given_style) click to toggle source
# File lib/rubocop/cop/layout/multiline_operation_indentation.rb, line 97
def should_align?(node, rhs, given_style)
  assignment_node = part_of_assignment_rhs(node, rhs)
  if assignment_node
    assignment_rhs = CheckAssignment.extract_rhs(assignment_node)
    return true if begins_its_line?(assignment_rhs.source_range)
  end

  given_style == :aligned &&
    (kw_node_with_special_indentation(node) ||
     assignment_node ||
     argument_in_method_call(node, :with_or_without_parentheses))
end