class RuboCop::Cop::Style::CommentAnnotation
# OPTIMIZE does not work
# good
# Optimize does not work
# bad
# FIXME does not work
# good
# fixme does not work
# bad
# TODO make better
# good
# TODO: make better
# bad
@example RequireColon: false
# OPTIMIZE: does not work
# good
# Optimize does not work
# bad
# FIXME: does not work
# good
# fixme: does not work
# bad
# TODO: make better
# good
# TODO:make better
# bad
# TODO: make better
# good
# TODO make better
# bad
@example RequireColon: true (default)
annotation.
incorrect registering of keywords (eg. ‘review`) inside a paragraph as an
if an annotation keyword starts another line. This is done to prevent
comment), only the first line will be able to register an offense, even
NOTE: With a multiline comment block (where each line is only a
to guidelines.
This cop checks that comment annotation keywords are written according
def annotation_range(comment, margin, first_word, colon, space)
def annotation_range(comment, margin, first_word, colon, space) start = comment.loc.expression.begin_pos + margin.length length = concat_length(first_word, colon, space) range_between(start, start + length) end
def concat_length(*args)
def concat_length(*args) args.reduce(0) { |acc, elem| acc + elem.to_s.length } end
def correct_annotation?(first_word, colon, space, note)
def correct_annotation?(first_word, colon, space, note) return correct_colon_annotation?(first_word, colon, space, note) if requires_colon? correct_space_annotation?(first_word, colon, space, note) end
def correct_colon_annotation?(first_word, colon, space, note)
def correct_colon_annotation?(first_word, colon, space, note) keyword?(first_word) && (colon && space && note || !colon && !note) end
def correct_offense(corrector, range, first_word)
def correct_offense(corrector, range, first_word) return corrector.replace(range, "#{first_word.upcase}: ") if requires_colon? corrector.replace(range, "#{first_word.upcase} ") end
def correct_space_annotation?(first_word, colon, space, note)
def correct_space_annotation?(first_word, colon, space, note) keyword?(first_word) && (!colon && space && note || !colon && !note) end
def first_comment_line?(comments, index)
def first_comment_line?(comments, index) index.zero? || comments[index - 1].loc.line < comments[index].loc.line - 1 end
def inline_comment?(comment)
def inline_comment?(comment) !comment_line?(comment.loc.expression.source_line) end
def on_new_investigation
def on_new_investigation processed_source.comments.each_with_index do |comment, index| next unless first_comment_line?(processed_source.comments, index) || inline_comment?(comment) margin, first_word, colon, space, note = split_comment(comment) next unless annotation?(comment) && !correct_annotation?(first_word, colon, space, note) range = annotation_range(comment, margin, first_word, colon, space) register_offense(range, note, first_word) end end
def register_offense(range, note, first_word)
def register_offense(range, note, first_word) message = requires_colon? ? MSG_COLON_STYLE : MSG_SPACE_STYLE add_offense( range, message: format(note ? message : MISSING_NOTE, keyword: first_word) ) do |corrector| next if note.nil? correct_offense(corrector, range, first_word) end end
def requires_colon?
def requires_colon? cop_config['RequireColon'] end