class RuboCop::Cop::Style::EmptyLineBetweenDefs

This cop checks whether method definitions are separated by empty lines.

Constants

MSG

Public Instance Methods

check_defs(nodes) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 23
def check_defs(nodes)
  return if blank_lines_between?(*nodes)
  return if nodes.all?(&:single_line?) &&
            cop_config['AllowAdjacentOneLineDefs']

  add_offense(nodes.last, :keyword)
end
on_begin(node) click to toggle source

We operate on `begin` nodes, instead of using `OnMethodDef`, so that we can walk over pairs of consecutive nodes and efficiently access a node's predecessor; prev_node ends up doing a linear scan over siblings, so we don't want to call it on each def.

# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 16
def on_begin(node)
  node.children.each_cons(2) do |prev, n|
    nodes = [prev, n]
    check_defs(nodes) if nodes.all?(&method(:def_node?))
  end
end

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 62
def autocorrect(node)
  prev_def = prev_node(node)
  end_pos = prev_def.loc.end.end_pos
  source_buffer = prev_def.loc.end.source_buffer
  newline_pos = source_buffer.source.index("\n", end_pos)
  newline = Parser::Source::Range.new(source_buffer,
                                      newline_pos,
                                      newline_pos + 1)
  ->(corrector) { corrector.insert_after(newline, "\n") }
end
blank_lines_between?(first_def_node, second_def_node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 38
def blank_lines_between?(first_def_node, second_def_node)
  lines_between_defs(first_def_node, second_def_node).any?(&:blank?)
end
def_end(node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 58
def def_end(node)
  node.loc.end.line
end
def_node?(node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 33
def def_node?(node)
  return unless node
  node.def_type? || node.defs_type?
end
def_start(node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 54
def def_start(node)
  node.loc.keyword.line
end
lines_between_defs(first_def_node, second_def_node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 48
def lines_between_defs(first_def_node, second_def_node)
  line_range = def_end(first_def_node)..(def_start(second_def_node) - 2)

  processed_source.lines[line_range]
end
prev_node(node) click to toggle source
# File lib/rubocop/cop/style/empty_line_between_defs.rb, line 42
def prev_node(node)
  return nil unless node.sibling_index > 0

  node.parent.children[node.sibling_index - 1]
end