class RuboCop::Cop::Layout::DotPosition

This cop checks the . position in multi-line method calls.

@example EnforcedStyle: leading (default)

# bad
something.
  method

# good
something
  .method

@example EnforcedStyle: trailing

# bad
something
  .method

# good
something.
  method

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 39
def autocorrect(node)
  lambda do |corrector|
    dot = node.loc.dot.source
    corrector.remove(node.loc.dot)
    case style
    when :leading
      corrector.insert_before(selector_range(node), dot)
    when :trailing
      corrector.insert_after(node.receiver.source_range, dot)
    end
  end
end
on_csend(node)
Alias for: on_send
on_send(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 28
def on_send(node)
  return unless node.dot? || ampersand_dot?(node)

  if proper_dot_position?(node)
    correct_style_detected
  else
    add_offense(node, location: :dot) { opposite_style_detected }
  end
end
Also aliased as: on_csend

Private Instance Methods

ampersand_dot?(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 99
def ampersand_dot?(node)
  node.loc.respond_to?(:dot) && node.loc.dot && node.loc.dot.is?('&.')
end
correct_dot_position_style?(dot_line, selector_line) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 87
def correct_dot_position_style?(dot_line, selector_line)
  case style
  when :leading then dot_line == selector_line
  when :trailing then dot_line != selector_line
  end
end
line_between?(first_line, second_line) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 83
def line_between?(first_line, second_line)
  (first_line - second_line) > 1
end
message(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 54
def message(node)
  dot = node.loc.dot.source
  "Place the #{dot} on the " +
    case style
    when :leading
      'next line, together with the method name.'
    when :trailing
      'previous line, together with the method call receiver.'
    end
end
proper_dot_position?(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 65
def proper_dot_position?(node)
  receiver_line = node.receiver.source_range.end.line
  selector_line = selector_range(node).line

  # receiver and selector are on the same line
  return true if selector_line == receiver_line

  dot_line = node.loc.dot.line

  # don't register an offense if there is a line comment between the
  # dot and the selector otherwise, we might break the code while
  # "correcting" it (even if there is just an extra blank line, treat
  # it the same)
  return true if line_between?(selector_line, dot_line)

  correct_dot_position_style?(dot_line, selector_line)
end
selector_range(node) click to toggle source
# File lib/rubocop/cop/layout/dot_position.rb, line 94
def selector_range(node)
  # l.(1) has no selector, so we use the opening parenthesis instead
  node.loc.selector || node.loc.begin
end