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