class RuboCop::Cop::Style::DotPosition

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

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/style/dot_position.rb, line 10
def on_send(node)
  return unless node.loc.dot

  if proper_dot_position?(node)
    correct_style_detected
  else
    add_offense(node, :dot) { opposite_style_detected }
  end
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/dot_position.rb, line 61
def autocorrect(node)
  receiver, _method_name, *_args = *node
  if node.loc.selector
    selector = node.loc.selector
  else
    # l.(1) has no selector, so we use the opening parenthesis instead
    selector = node.loc.begin
  end

  lambda do |corrector|
    corrector.remove(node.loc.dot)
    case style
    when :leading
      corrector.insert_before(selector, '.')
    when :trailing
      corrector.insert_after(receiver.source_range, '.')
    end
  end
end
message(_node) click to toggle source
# File lib/rubocop/cop/style/dot_position.rb, line 22
def message(_node)
  'Place the . 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/style/dot_position.rb, line 32
def proper_dot_position?(node)
  receiver, _method_name, *_args = *node

  receiver_line = receiver.source_range.end.line

  if node.loc.selector
    selector_line = node.loc.selector.line
  else
    # l.(1) has no selector, so we use the opening parenthesis instead
    selector_line = node.loc.begin.line
  end

  # 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 (selector_line - dot_line) > 1

  case style
  when :leading then dot_line == selector_line
  when :trailing then dot_line != selector_line
  end
end