class RuboCop::Cop::Layout::MultilineOperationIndentation
end
something_else
something &&
b
if a +
# good
end
something_else
something &&
b
if a +
# bad
@example EnforcedStyle: indented
end
something_else
something &&
b
if a +
# good
end
something_else
something &&
b
if a +
# bad
@example EnforcedStyle: aligned (default)
style.
contexts, the second operand should be indented regardless of enforced
of an ‘if` or `while` condition, a `return` statement, etc. In other
The `aligned` style checks that operators are aligned if they are part
binary operations that span more than one line.
This cop checks the indentation of the right hand side operand in
def autocorrect(corrector, node)
def autocorrect(corrector, node) AlignmentCorrector.correct(corrector, 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 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) return false if node.send_type? && node.unary_operation? !node.loc.dot # Don't check method calls with dot operator. end
def right_hand_side(send_node)
def right_hand_side(send_node) send_node.first_argument.source_range 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