blob: 6b3d5c90efcf35cb79f4b411574fce3f861805ce [file] [log] [blame]
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/error/error.dart';
// It is hard to visually separate each code's _doc comment_ from its published
// _documentation comment_ when each is written as an end-of-line comment.
// ignore_for_file: slash_for_doc_comments
/**
* The error code indicating a marker in code for work that needs to be finished
* or revisited.
*/
class TodoCode extends ErrorCode {
/**
* A standard TODO comment marked as TODO.
*/
static const TodoCode TODO = TodoCode('TODO');
/**
* A TODO comment marked as FIXME.
*/
static const TodoCode FIXME = TodoCode('FIXME');
/**
* A TODO comment marked as HACK.
*/
static const TodoCode HACK = TodoCode('HACK');
/**
* A TODO comment marked as UNDONE.
*/
static const TodoCode UNDONE = TodoCode('UNDONE');
static const _codes = {
'TODO': TODO,
'FIXME': FIXME,
'HACK': HACK,
'UNDONE': UNDONE,
};
/**
* This matches the two common Dart task styles
*
* * TODO:
* * TODO(username):
*
* As well as
* * TODO
*
* But not
* * todo
* * TODOS
*
* It also supports wrapped TODOs where the next line is indented by a space:
*
* /**
* * TODO(username): This line is
* * wrapped onto the next line
* */
*
* The matched kind of the TODO (TODO, FIXME, etc.) is returned in named
* captures of "kind1", "kind2" (since it is not possible to reuse a name
* across different parts of the regex).
*/
static RegExp TODO_REGEX = RegExp(
'([\\s/\\*])(((?<kind1>$_TODO_KIND_PATTERN)[^\\w\\d][^\\r\\n]*(?:\\n\\s*\\* [^\\r\\n]*)*)'
'|((?<kind2>$_TODO_KIND_PATTERN):?\$))');
static final _TODO_KIND_PATTERN = _codes.keys.join('|');
/**
* Initialize a newly created error code to have the given [name].
*/
const TodoCode(String name)
: super(
message: "{0}",
name: name,
uniqueName: 'TodoCode.$name',
);
@override
ErrorSeverity get errorSeverity => ErrorSeverity.INFO;
@override
ErrorType get type => ErrorType.TODO;
/// Returns the TodoCode for [kind], falling back to [TODO].
static TodoCode forKind(String kind) => _codes[kind] ?? TODO;
}