184 lines
7.5 KiB
Dart
184 lines
7.5 KiB
Dart
|
|
// Copyright (c) 2020, 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.
|
||
|
|
|
||
|
|
/// Annotations that describe the intended use of other annotations.
|
||
|
|
// ignore: unnecessary_library_name
|
||
|
|
library meta_meta;
|
||
|
|
|
||
|
|
/// An annotation used on classes that are intended to be used as annotations
|
||
|
|
/// to indicate the kinds of declarations and directives for which the
|
||
|
|
/// annotation is appropriate.
|
||
|
|
///
|
||
|
|
/// The kinds are represented by the constants defined in [TargetKind].
|
||
|
|
///
|
||
|
|
/// Tools, such as the analyzer, can provide feedback if
|
||
|
|
///
|
||
|
|
/// * the annotation is associated with anything other than a class, where the
|
||
|
|
/// class must be usable as an annotation (that is, contain at least one
|
||
|
|
/// `const` constructor).
|
||
|
|
/// * the annotated annotation is associated with anything other than the kinds
|
||
|
|
/// of declarations listed as valid targets.
|
||
|
|
///
|
||
|
|
/// This type is not intended to be extended and will be marked as `final`
|
||
|
|
/// in a future release of `package:meta`.
|
||
|
|
@Target({TargetKind.classType})
|
||
|
|
class Target {
|
||
|
|
/// The kinds of declarations with which the annotated annotation can be
|
||
|
|
/// associated.
|
||
|
|
final Set<TargetKind> kinds;
|
||
|
|
|
||
|
|
/// Create a new instance of [Target] to be used as an annotation
|
||
|
|
/// on a class intended to be used as an annotation, with the
|
||
|
|
/// specified target [kinds] that it can be applied to.
|
||
|
|
const Target(this.kinds);
|
||
|
|
}
|
||
|
|
|
||
|
|
/// An enumeration of the kinds of targets to which an annotation can be
|
||
|
|
/// applied.
|
||
|
|
///
|
||
|
|
/// This type is not intended to be extended and will be marked as `final`
|
||
|
|
/// in a future release of `package:meta`.
|
||
|
|
class TargetKind {
|
||
|
|
/// Indicates that an annotation is valid on any class declaration.
|
||
|
|
static const classType = TargetKind._('classes', 'classType');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any constructor declaration, both
|
||
|
|
/// factory and generative constructors, whether it's in a class, enum, or
|
||
|
|
/// extension type. Extension type primary constructors are not supported,
|
||
|
|
/// because there is no way to annotate a primary constructor.
|
||
|
|
static const constructor = TargetKind._('constructors', 'constructor');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any directive in a library or
|
||
|
|
/// part file, whether it's a `library`, `import`, `export`, `part`, or
|
||
|
|
/// `part of` directive.
|
||
|
|
static const directive = TargetKind._('directives', 'directive');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any enum declaration.
|
||
|
|
static const enumType = TargetKind._('enums', 'enumType');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any enum value declaration.
|
||
|
|
static const enumValue = TargetKind._('enum values', 'enumValue');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any extension declaration.
|
||
|
|
static const extension = TargetKind._('extensions', 'extension');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any extension type declaration.
|
||
|
|
static const extensionType = TargetKind._('extension types', 'extensionType');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any field declaration, both
|
||
|
|
/// instance and static fields, whether it's in a class, enum, mixin, or
|
||
|
|
/// extension.
|
||
|
|
static const field = TargetKind._('fields', 'field');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any top-level function
|
||
|
|
/// declaration.
|
||
|
|
static const function = TargetKind._('top-level functions', 'function');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on the first directive in a library,
|
||
|
|
/// whether that's a `library`, `import`, `export` or `part` directive. This
|
||
|
|
/// doesn't include the `part of` directive in a part file.
|
||
|
|
static const library = TargetKind._('libraries', 'library');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any getter declaration, both
|
||
|
|
/// instance or static getters, whether it's in a class, enum, mixin,
|
||
|
|
/// extension, extension type, or at the top-level of a library.
|
||
|
|
static const getter = TargetKind._('getters', 'getter');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any method declaration, both
|
||
|
|
/// instance and static methods, whether it's in a class, enum, mixin,
|
||
|
|
/// extension, or extension type.
|
||
|
|
static const method = TargetKind._('methods', 'method');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any mixin declaration.
|
||
|
|
static const mixinType = TargetKind._('mixins', 'mixinType');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any optional formal parameter
|
||
|
|
/// declaration, whether it's in a constructor, function (named or anonymous),
|
||
|
|
/// function type, function-typed formal parameter, or method.
|
||
|
|
static const optionalParameter =
|
||
|
|
TargetKind._('optional parameters', 'optionalParameter');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any overridable instance member
|
||
|
|
/// declaration, whether it's in a class, enum, extension type, or mixin. This
|
||
|
|
/// includes instance fields, getters, setters, methods, and operators.
|
||
|
|
static const overridableMember =
|
||
|
|
TargetKind._('overridable members', 'overridableMember');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any formal parameter declaration,
|
||
|
|
/// whether it's in a constructor, function (named or anonymous), function
|
||
|
|
/// type, function-typed formal parameter, or method.
|
||
|
|
static const parameter = TargetKind._('parameters', 'parameter');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any setter declaration, both
|
||
|
|
/// instance or static setters, whether it's in a class, enum, mixin,
|
||
|
|
/// extension, extension type, or at the top-level of a library.
|
||
|
|
static const setter = TargetKind._('setters', 'setter');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any top-level variable
|
||
|
|
/// declaration.
|
||
|
|
static const topLevelVariable =
|
||
|
|
TargetKind._('top-level variables', 'topLevelVariable');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any declaration that introduces a
|
||
|
|
/// type. This includes classes, enums, mixins, and typedefs, but does not
|
||
|
|
/// include extensions because extensions don't introduce a type.
|
||
|
|
// TODO(srawlins): This should include extension types.
|
||
|
|
static const type =
|
||
|
|
TargetKind._('types (classes, enums, mixins, or typedefs)', 'type');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any typedef declaration.
|
||
|
|
static const typedefType = TargetKind._('typedefs', 'typedefType');
|
||
|
|
|
||
|
|
/// Indicates that an annotation is valid on any type parameter declaration,
|
||
|
|
/// whether it's on a class, enum, function type, function, mixin, extension,
|
||
|
|
/// extension type, or typedef.
|
||
|
|
static const typeParameter = TargetKind._('type parameters', 'typeParameter');
|
||
|
|
|
||
|
|
/// All current [TargetKind] values of targets to
|
||
|
|
/// which an annotation can be applied.
|
||
|
|
static const values = [
|
||
|
|
classType,
|
||
|
|
constructor,
|
||
|
|
directive,
|
||
|
|
enumType,
|
||
|
|
enumValue,
|
||
|
|
extension,
|
||
|
|
extensionType,
|
||
|
|
field,
|
||
|
|
function,
|
||
|
|
library,
|
||
|
|
getter,
|
||
|
|
method,
|
||
|
|
mixinType,
|
||
|
|
optionalParameter,
|
||
|
|
overridableMember,
|
||
|
|
parameter,
|
||
|
|
setter,
|
||
|
|
topLevelVariable,
|
||
|
|
type,
|
||
|
|
typedefType,
|
||
|
|
typeParameter,
|
||
|
|
];
|
||
|
|
|
||
|
|
/// A user visible string used to describe this target kind.
|
||
|
|
final String displayString;
|
||
|
|
|
||
|
|
/// The name of the [TargetKind] value.
|
||
|
|
///
|
||
|
|
/// The name is a string containing the source identifier used
|
||
|
|
/// to declare the [TargetKind] value. For example,
|
||
|
|
/// the result of `TargetKind.classType.name`is the string "classType".
|
||
|
|
final String name;
|
||
|
|
|
||
|
|
// This class is not meant to be instantiated or extended; this constructor
|
||
|
|
// prevents instantiation and extension.
|
||
|
|
const TargetKind._(this.displayString, this.name);
|
||
|
|
|
||
|
|
/// A numeric identifier for the enumerated value.
|
||
|
|
int get index => values.indexOf(this);
|
||
|
|
|
||
|
|
@override
|
||
|
|
String toString() => 'TargetKind.$name';
|
||
|
|
}
|