class RuboCop::Cop::Layout::MultilineOperationIndentation
end
something
b
if a +
# good
end
something
b
if a +
# bad
@example EnforcedStyle: indented
end
something
b
if a +
# good
end
something
b
if a +
# bad
@example EnforcedStyle: aligned (default)
binary operations that span more than one line.
This cop checks the indentation of the right hand side operand in
def autocorrect(node)
def autocorrect(node) AlignmentCorrector.correct(processed_source, node, @column_delta) end
def check_and_or(node)
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
def message(node, lhs, rhs)
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
def offending_range(node, lhs, rhs, given_style)
def offending_range(node, lhs, rhs, given_style) return false unless begins_its_line?(rhs) return false if lhs.first_line == rhs.line # Needed for unary op. 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
def on_and(node)
def on_and(node) check_and_or(node) end
def on_or(node)
def on_or(node) check_and_or(node) end
def relevant_node?(node)
def relevant_node?(node) !node.loc.dot # Don't check method calls with dot operator. end
def should_align?(node, rhs, given_style)
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
def validate_config
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