class RuboCop::Cop::Style::CommentedKeyword

Checks for comments put on the same line as some keywords. These keywords are: ‘class`, `module`, `def`, `begin`, `end`.

Note that some comments (‘:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`) are allowed.

Autocorrection removes comments from ‘end` keyword and keeps comments for `class`, `module`, `def` and `begin` above the keyword.

@safety

Autocorrection is unsafe because it may remove a comment that is
meaningful.

@example

# bad
if condition
  statement
end # end if

# bad
class X # comment
  statement
end

# bad
def x; end # comment

# good
if condition
  statement
end

# good
class X # :nodoc:
  y
end

Constants

ALLOWED_COMMENTS
ALLOWED_COMMENT_REGEXES
KEYWORDS
KEYWORD_REGEXES
MSG
REGEXP

Public Instance Methods

on_new_investigation() click to toggle source
# File lib/rubocop/cop/style/commented_keyword.rb, line 57
def on_new_investigation
  processed_source.comments.each do |comment|
    next unless offensive?(comment) && (match = source_line(comment).match(REGEXP))

    register_offense(comment, match[:keyword])
  end
end

Private Instance Methods

offensive?(comment) click to toggle source
# File lib/rubocop/cop/style/commented_keyword.rb, line 80
def offensive?(comment)
  line = source_line(comment)
  KEYWORD_REGEXES.any? { |r| r.match?(line) } &&
    ALLOWED_COMMENT_REGEXES.none? { |r| r.match?(line) }
end
register_offense(comment, matched_keyword) click to toggle source
# File lib/rubocop/cop/style/commented_keyword.rb, line 67
def register_offense(comment, matched_keyword)
  add_offense(comment, message: format(MSG, keyword: matched_keyword)) do |corrector|
    range = range_with_surrounding_space(comment.loc.expression, newlines: false)
    corrector.remove(range)

    unless matched_keyword == 'end'
      corrector.insert_before(
        range.source_buffer.line_range(comment.loc.line), "#{comment.text}\n"
      )
    end
  end
end
source_line(comment) click to toggle source
# File lib/rubocop/cop/style/commented_keyword.rb, line 86
def source_line(comment)
  comment.location.expression.source_line
end