class RuboCop::Cop::Layout::EmptyLineAfterMagicComment

Checks for a newline after the final magic comment.

@example

# good
# frozen_string_literal: true

# Some documentation for Person
class Person
  # Some code
end

# bad
# frozen_string_literal: true
# Some documentation for Person
class Person
  # Some code
end

Constants

MSG

Public Instance Methods

on_new_investigation() click to toggle source
# File lib/rubocop/cop/layout/empty_line_after_magic_comment.rb, line 29
def on_new_investigation
  return unless (last_magic_comment = last_magic_comment(processed_source))
  return unless (next_line = processed_source[last_magic_comment.loc.line])
  return if next_line.strip.empty?

  offending_range = offending_range(last_magic_comment)

  add_offense(offending_range) do |corrector|
    corrector.insert_before(offending_range, "\n")
  end
end

Private Instance Methods

comments_before_code(source) click to toggle source
# File lib/rubocop/cop/layout/empty_line_after_magic_comment.rb, line 61
def comments_before_code(source)
  if source.ast
    source.comments.take_while { |comment| comment.loc.line < source.ast.loc.line }
  else
    source.comments
  end
end
last_magic_comment(source) click to toggle source

Find the last magic comment in the source file.

Take all comments that precede the first line of code (or just take them all in the case when there is no code), select the magic comments, and return the last magic comment in the file.

@return [Parser::Source::Comment] if magic comments exist before code @return [nil] otherwise

# File lib/rubocop/cop/layout/empty_line_after_magic_comment.rb, line 55
def last_magic_comment(source)
  comments_before_code(source)
    .reverse
    .find { |comment| MagicComment.parse(comment.text).any? }
end
offending_range(last_magic_comment) click to toggle source
# File lib/rubocop/cop/layout/empty_line_after_magic_comment.rb, line 43
def offending_range(last_magic_comment)
  source_range(processed_source.buffer, last_magic_comment.loc.line + 1, 0)
end