// Copyright (c) 2016, 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. // ignore_for_file: library_private_types_in_public_api /// Annotations that developers can use to express the intentions that otherwise /// can't be deduced by statically analyzing the source code. /// /// See also @[deprecated] and @[override] in the `dart:core` library. /// /// Annotations provide semantic information that tools can use to provide a /// better user experience. For example, an IDE might not autocomplete the name /// of a function that's been marked `@deprecated`, or it might display the /// function's name differently. /// /// For information on installing and importing this library, see the /// [meta package on pub.dev](https://pub.dev/packages/meta). To learn more /// about using annotations, check out the /// [Metadata](https://dart.dev/language/metadata) documentation. // ignore: unnecessary_library_name library meta; import 'meta_meta.dart'; /// Used to annotate a function `f`. Indicates that `f` always throws an /// exception. Any functions that override `f`, in class inheritance, are also /// expected to conform to this contract. /// /// Tools, such as the analyzer, can use this to understand whether a block of /// code "exits". For example: /// /// ```dart /// @alwaysThrows toss() { throw 'Thrown'; } /// /// int fn(bool b) { /// if (b) { /// return 0; /// } else { /// toss(); /// print("Hello."); /// } /// } /// ``` /// /// Without the annotation on `toss`, it would look as though `fn` doesn't /// always return a value. The annotation shows that `fn` does always exit. In /// addition, the annotation reveals that any statements following a call to /// `toss` (like the `print` call) are dead code. /// /// Tools, such as the analyzer, can also expect this contract to be enforced; /// that is, tools may emit warnings if a function with this annotation /// _doesn't_ always throw. /// /// **Deprecated:** This annotation is deprecated and will be /// removed in a future release of `package:meta`. /// After Dart 2.9, you can instead specify a return type of `Never` /// to indicate that a function never returns. @Deprecated("Use a return type of 'Never' instead") const _AlwaysThrows alwaysThrows = _AlwaysThrows(); /// Used to annotate a [Future]-returning function (including constructors, /// getters, methods, and operators), or a [Future]-typed field (including /// top-level, instance, and static) `f`. Indicates that the [Future] value that /// `f` returns does not need to be awaited. Any methods that override `f` in /// class inheritance, are also expected to conform to this contract. /// /// Tools, such as the analyzer, can use this to understand whether to report /// that a [Future]-typed value does not need to be awaited: /// /// ```dart /// @awaitNotRequired Future log(String message) { ... } /// /// void fn() { /// log('Message'); // Not important to wait for logging to complete. /// } /// ``` /// /// Without the annotation on `log`, the analyzer may report a lint diagnostic /// at the call to `log`, such as `discarded_futures` or `unawaited_futures`, /// regarding the danger of not awaiting the function call, depending on what /// lint rules are enabled. /// /// Tools, such as the analyzer, can also provide feedback if /// /// * the annotation is associated with anything other than a constructor, /// function, method, operator, field, or top-level variable, or /// * the annotation is associated with a constructor, function, method, or /// operator that does not return a [Future], or /// * the annotation is associated with a field or top-level variable that is /// not typed as a [Future]. const _AwaitNotRequired awaitNotRequired = _AwaitNotRequired(); /// Used to annotate a parameter of an instance method that overrides another /// method. /// /// Indicates that this parameter may have a tighter type than the parameter on /// its superclass. The actual argument will be checked at runtime to ensure it /// is a subtype of the overridden parameter type. /// /// **Deprecated:** This annotation is deprecated and will be /// removed in a future release of `package:meta`. /// In Dart 2 and later, you can instead use the built-in `covariant` modifier. @Deprecated('Use the `covariant` modifier instead') const _Checked checked = _Checked(); /// Used to annotate a method, getter, top-level function, or top-level getter /// to indicate that the value obtained by invoking it should not be stored in a /// field or top-level variable. The annotation can also be applied to a class /// to implicitly annotate all of the valid members of the class, or applied to /// a library to annotate all of the valid members of the library, including /// classes. If a value returned by an element marked as `doNotStore` is /// returned from a function or getter, that function or getter should be /// similarly annotated. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a library, class, /// method or getter, top-level getter or function, or /// * an invocation of a member that has this annotation is returned by a /// method, function or getter that is not similarly annotated as /// `doNotStore`, or /// * an invocation of a member that has this annotation is assigned to a field /// or top-level variable. const _DoNotStore doNotStore = _DoNotStore(); /// Used to annotate an optional parameter, method, getter or top-level getter /// or function that is not intended to be accessed in checked-in code, but /// might be ephemerally used during development or local testing. /// /// The intention of this annotation is to signify an API is available for /// temporary or ephemeral use (such as debugging or local testing), but should /// be removed before the code is submitted or merged into a tested branch of /// the repository (e.g. `main` or similar). /// /// For example: /// /// ```dart /// void test( /// String name, /// void Function() testFunction, { /// @doNotSubmit bool skip = false, /// }) { /* ... */ } /// /// void main() { /// // OK. /// test('foo', () => print('foo')); /// /// // HINT: Remove before submitting. /// test('bar', () => print('bar'), skip: true); /// } /// ``` /// /// Tools, such as the analyzer, can provide feedback if /// /// * a declaration that has this annotation is referenced anywhere, including /// the library in which it is declared, in checked-in code. Exceptions are /// being referenced by a declaration that is also annotated with /// `@doNotSubmit` _or_ referencing a parameter that is annotated with /// `@doNotSubmit` in the same method or function. const _DoNotSubmit doNotSubmit = _DoNotSubmit(); /// Used to annotate a library, or any declaration that is part of the public /// interface of a library (such as top-level members, class members, and /// function parameters) to indicate that the annotated API is experimental and /// may be removed or changed at any-time without updating the version of the /// containing package, despite the fact that it would otherwise be a breaking /// change. /// /// If the annotation is applied to a library then it is equivalent to applying /// the annotation to all of the top-level members of the library. Applying the /// annotation to a class does *not* apply the annotation to subclasses, but /// does apply the annotation to members of the class. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with a declaration that is not part of the /// public interface of a library (such as a local variable or a declaration /// that is private) or a directive other than the first directive in the /// library, or /// * the declaration is referenced by a package that has not explicitly /// indicated its intention to use experimental APIs (details TBD). const _Experimental experimental = _Experimental(); /// Used to annotate an instance or static method `m`. Indicates that `m` must /// either be abstract or must return a newly allocated object or `null`. In /// addition, every method that either implements or overrides `m` is implicitly /// annotated with this same annotation. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a method, or /// * a method that has this annotation can return anything other than a newly /// allocated object or `null`. const _Factory factory = _Factory(); /// Used to annotate a class `C`. Indicates that `C` and all subtypes of `C` /// must be immutable. /// /// A class is immutable if all of the instance fields of the class, whether /// defined directly or inherited, are `final`. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a class, or /// * a class that has this annotation or extends, implements or mixes in a /// class that has this annotation is not immutable. const Immutable immutable = Immutable(); /// Used to annotate a declaration which should only be used from within the /// package in which it is declared, and which should not be exposed from said /// package's public API. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the declaration is declared in a package's public API, or is exposed from /// a package's public API, or /// * the declaration is private, an unnamed extension, a static member of a /// private class, mixin, or extension, a value of a private enum, or a /// constructor of a private class, or /// * the declaration is referenced outside the package in which it is declared. const _Internal internal = _Internal(); /// Used to annotate a test framework function that runs a single test. /// /// Tools, such as IDEs, can show invocations of such function in a file /// structure view to help the user navigating in large test files. /// /// The first parameter of the function must be the description of the test. const _IsTest isTest = _IsTest(); /// Used to annotate a test framework function that runs a group of tests. /// /// Tools, such as IDEs, can show invocations of such function in a file /// structure view to help the user navigating in large test files. /// /// The first parameter of the function must be the description of the group. const _IsTestGroup isTestGroup = _IsTestGroup(); /// Used to annotate a const constructor `c`. Indicates that any invocation of /// the constructor must use the keyword `const` unless one or more of the /// arguments to the constructor is not a compile-time constant. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a const constructor, /// or /// * an invocation of a constructor that has this annotation is not invoked /// using the `const` keyword unless one or more of the arguments to the /// constructor is not a compile-time constant. const _Literal literal = _Literal(); /// Used to annotate a parameter which should be constant. /// /// The Dart type system does not allow distinguishing values of constant /// expressions from other values of the same type, so a function cannot /// ask to have only constant values as arguments. /// This annotation marks a parameter as requiring a constant expression as /// argument. The analyzer can warn, or err if so configured, if a non-constant /// expression is used as argument. /// /// The annotation can be applied to any parameter, but if it is applied to a /// parameter of an instance member, subclasses overriding the member will not /// inherit the annotation. If the subclass member also wants a constant /// argument, it must annotate its own parameter as well. /// /// Notice that if an annotatated instance member overrides a superclass member /// where the same parameter is not annotated with this annotation, then a user /// can cast to the superclass and invoke with a non-constant argument without /// any warnings. /// /// An example use could be the arguments to functions annotated with /// [RecordUse], as only constant arguments can be made available /// to the post-compile steps. /// /// ```dart /// import 'package:meta/meta.dart' show mustBeConst; /// /// void main() { /// f(); /// A().i = 3; /// } /// /// const v = 3; /// /// int f() => g(v); /// /// int g(@mustBeConst int value) => value + 1; /// /// class A { /// int? _i; /// /// int? get i => _i; /// /// set i(@mustBeConst int? value) { /// _i = value; /// } /// } /// ``` @experimental const _MustBeConst mustBeConst = _MustBeConst(); /// Used to annotate an instance member `m` declared on a class or mixin `C`. /// Indicates that every concrete subclass of `C` must directly override `m`. /// /// The intention of this annotation is to "re-abtract" a member that was /// previously concrete, and to ensure that subclasses provide their own /// implementation of the member. For example: /// /// ```dart /// base class Entity { /// @mustBeOverridden /// String toString(); /// } /// /// abstract class AbstractEntity extends Entity { /// // OK: AbstractEntity is abstract. /// } /// /// sealed class SealedEntity extends Entity { /// // OK: SealedEntity is sealed, which implies abstract. /// } /// /// mixin MixinEntity on Entity { /// // OK: MixinEntity is abstract. /// } /// /// class Person extends Entity { /// // ERROR: Missing new implementation of 'toString'. /// } /// /// class Animal extends Entity { /// // OK: Animal provides its own implementation of 'toString'. /// String toString() => 'Animal'; /// } /// ``` /// /// This annotation places no restrictions on the overriding members. In /// particular, it does not require that the overriding members invoke the /// overridden member. The annotation [mustCallSuper] can be used to add that /// requirement. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than an instance member /// (a method, operator, field, getter, or setter) of a class or of a mixin, /// or /// * the annotation is associated with a member `m` in class or mixin `C`, and /// there is a concrete class `D` which is a subclass of `C` (directly or /// indirectly), and `D` does not directly declare a concrete override of `m` /// and does not directly declare a concrete override of `noSuchMethod`. const _MustBeOverridden mustBeOverridden = _MustBeOverridden(); /// Used to annotate an instance member (method, getter, setter, operator, or /// field) `m`. Indicates that every invocation of a member that overrides `m` /// must also invoke `m`. In addition, every method that overrides `m` is /// implicitly annotated with this same annotation. /// /// Note that private members with this annotation cannot be validly overridden /// outside of the library that defines the annotated member. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than an instance member, /// or /// * a member that overrides a member that has this annotation can return /// without invoking the overridden member. const _MustCallSuper mustCallSuper = _MustCallSuper(); /// Used to annotate an instance member (method, getter, setter, operator, or /// field) `m` in a class `C` or mixin `M`. Indicates that `m` should not be /// overridden in any classes that extend or mixin `C` or `M`. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than an instance member, /// * the annotation is associated with an abstract member (because subclasses /// are required to override the member), /// * the annotation is associated with an extension method, /// * the annotation is associated with a member `m` in class `C`, and there is /// a class `D` or mixin `M`, that extends or mixes in `C`, that declares an /// overriding member `m`. const _NonVirtual nonVirtual = _NonVirtual(); /// Used to annotate a class, mixin, extension, function, method, or typedef /// declaration `C`. Indicates that any type arguments declared on `C` are to /// be treated as optional. /// /// Tools such as the analyzer and linter can use this information to suppress /// warnings that would otherwise require type arguments on `C` to be provided. const _OptionalTypeArgs optionalTypeArgs = _OptionalTypeArgs(); /// Used to annotate an instance member in a class or mixin which is meant to /// be visible only within the declaring library, and to other instance members /// of the class or mixin, and their subtypes. /// /// If the annotation is on a field it applies to the getter, and setter if /// appropriate, that are induced by the field. /// /// Indicates that the annotated instance member (method, getter, setter, /// operator, or field) `m` in a class or mixin `C` should only be referenced /// in specific locations. A reference from within the library in which `C` is /// declared is valid. Additionally, a reference from within an instance member /// in `C`, or a class that extends, implements, or mixes in `C` (either /// directly or indirectly) or a mixin that uses `C` as a superclass constraint /// is valid. Additionally a reference from within an instance member in an /// extension that applies to `C` is valid. /// /// Additionally restricts the instance of `C` on which `m` is referenced: a /// reference to `m` should either be in the same library in which `C` is /// declared, or should refer to `this.m` (explicitly or implicitly), and not /// `m` on any other instance of `C`. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than an instance member, /// or /// * a reference to a member `m` which has this annotation, declared in a /// class or mixin `C`, is found outside of the declaring library and outside /// of an instance member in any class that extends, implements, or mixes in /// `C` or any mixin that uses `C` as a superclass constraint, or /// * a reference to a member `m` which has this annotation, declared in a /// class or mixin `C`, is found outside of the declaring library and the /// receiver is something other than `this`. // TODO(srawlins): Add a sentence which defines "referencing" and explicitly // mentions tearing off, here and on the other annotations which use the word // "referenced." const _Protected protected = _Protected(); /// Used to annotate an instance member of an extension type that /// redeclares a member from a superinterface. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a valid instance /// member of an extension type (a method, operator, getter, or setter) or /// * is applied to a member that does not redeclare a member from either the /// extended type or a superinterface. @experimental const _Redeclare redeclare = _Redeclare(); /// Annotation for intentionally loosening restrictions on subtyping that would /// otherwise cause lint warnings to be produced by the `implicit_reopen` lint. /// /// Indicates that the annotated class, mixin, or mixin class declaration /// intentionally allows subtypes outside the library to implement it, or extend /// it, or mix it in, even though it has some superinterfaces whose restrictions /// prevent inheritance. /// /// A class, mixin, or mixin class declaration prevents inheritance if: /// /// * it is marked `interface` or `final` /// * it is marked `sealed`, and is implicitly `interface` or `final` /// based on the modifiers of its superinterfaces /// * it is an anonymous mixin application, and is implicitly `interface` or /// `final` based on the modifiers of its superinterfaces /// /// A declaration annotated with `@reopen` will suppress warnings from the /// [`implicit_reopen`](https://dart.dev/lints/implicit_reopen) lint. /// That lint will otherwise warn when a subtype has restrictions that are /// not sufficient to enforce the restrictions declared by class modifiers on /// one or more superinterfaces. /// /// In addition, tools, such as the analyzer, can provide feedback if /// /// * The annotation is applied to anything other than a class, mixin, or mixin /// class. /// * The annotation is applied to a class or mixin which does not require it. /// (The intent to reopen was not satisfied.) const _Reopen reopen = _Reopen(); /// Used to annotate a named parameter `p` in a method or function `f`. /// Indicates that every invocation of `f` must include an argument /// corresponding to `p`, despite the fact that `p` would otherwise be an /// optional parameter. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a named parameter, /// * the annotation is associated with a named parameter in a method `m1` that /// overrides a method `m0` and `m0` defines a named parameter with the same /// name that does not have this annotation, or /// * an invocation of a method or function does not include an argument /// corresponding to a named parameter that has this annotation. /// /// **Deprecated:** This annotation is set to be removed in a future release of /// `package:meta`. /// /// In Dart 2.12 and later, use the built-in `required` keyword /// to mark a named parameter as required. /// To learn more about `required`, check out the documentation on /// [named parameters](https://dart.dev/language/functions#named-parameters). @Deprecated( 'In Dart 2.12 and later, use the built-in `required` keyword to mark a ' 'named parameter as required.') const Required required = Required(); /// Annotation marking a class as not allowed as a super-type /// outside of the current package. /// /// Classes in the same package as the marked class may extend, implement or /// mix-in the annotated class. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a class, /// * the annotation is associated with a class `C`, and there is a class or /// mixin `D`, which extends, implements, mixes in, or constrains to `C`, and /// `C` and `D` are declared in different packages. /// /// **Note:** In Dart 3 and later, you can use built-in class modifiers to /// control what forms of subtyping are allowed outside the current library. /// To learn more about using class modifiers, check out the /// [Class modifiers](https://dart.dev/language/class-modifiers) documentation. const _Sealed sealed = _Sealed(); /// Used to annotate a method, field, or getter within a class, mixin, or /// extension, or a or top-level getter, variable or function to indicate that /// the value obtained by invoking it should be used. A value is considered used /// if it is assigned to a variable, passed to a function, or used as the target /// of an invocation, or invoked (if the result is itself a function). /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with anything other than a method, field or /// getter, top-level variable, getter or function or /// * the value obtained by a method, field, getter or top-level getter, /// variable or function annotated with `@useResult` is not used. const UseResult useResult = UseResult(); /// Used to annotate a field that is allowed to be overridden in Strong Mode. /// /// **Deprecated:** This annotation is deprecated and will be /// removed in a future release of `package:meta`. /// In Dart 2 and later, overriding fields is allowed by default, /// so this annotation no longer has any meaning. /// All uses of the annotation should be removed. @Deprecated('No longer has meaning') const _Virtual virtual = _Virtual(); /// Used to annotate an instance member that was made public so that it could be /// overridden but that is not intended to be referenced from outside the /// defining library. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with a declaration other than a public /// instance member in a class or mixin, or /// * the member is referenced outside of the defining library. const _VisibleForOverriding visibleForOverriding = _VisibleForOverriding(); /// Used to annotate a declaration that was made public, so that it is more /// visible than otherwise necessary, to make code testable. /// /// Tools, such as the analyzer, can provide feedback if /// /// * the annotation is associated with a declaration not in the `lib` folder /// of a package, or a private declaration, or a declaration in an unnamed /// static extension, or /// * the declaration is referenced outside of its defining library or a /// library which is in the `test` folder of the defining package. const _VisibleForTesting visibleForTesting = _VisibleForTesting(); /// Used to annotate a class. /// /// See [immutable] for more details. @Target({ TargetKind.classType, TargetKind.extensionType, TargetKind.mixinType, }) class Immutable { /// A human-readable explanation of the reason why the class is immutable. final String reason; /// Initialize a newly created instance to have the given [reason]. const Immutable([this.reason = '']); } /// Annotates a static method to be recorded. /// /// Applies to static functions, top-level functions, or extension methods. /// /// During compilation, all statically resolved calls to an annotated function /// are registered, and information about the annotated functions, the calls, /// and their arguments, is then made available to post-compile steps. // TODO(srawlins): Enforce with `TargetKind.method`. @experimental class RecordUse { /// Creates a [RecordUse] instance. /// /// This annotation can be placed as an annotation on functions whose /// statically resolved calls should be registered const RecordUse(); } /// Used to annotate a named parameter `p` in a method or function `f`. /// /// See [required] for more details. /// /// **Deprecated:** This annotation is set to be removed in a future release of /// `package:meta`. /// /// In Dart 2.12 and later, use the built-in `required` keyword /// to mark a named parameter as required. /// To learn more about `required`, check out the documentation on /// [named parameters](https://dart.dev/language/functions#named-parameters). @Deprecated( 'In Dart 2.12 and later, use the built-in `required` keyword to mark a ' 'named parameter as required.') class Required { /// A human-readable explanation of the reason why the annotated parameter is /// required. For example, the annotation might look like: /// /// ```dart /// ButtonWidget({ /// Function onHover, /// @Required('Buttons must do something when pressed') /// Function onPressed, /// ... /// }) ... /// ``` final String reason; /// Initialize a newly created instance to have the given [reason]. const Required([this.reason = '']); } /// See [useResult] for more details. @Target({ TargetKind.constructor, TargetKind.field, TargetKind.function, TargetKind.getter, TargetKind.method, TargetKind.topLevelVariable, }) class UseResult { /// A human-readable explanation of the reason why the value returned by /// accessing this member should be used. final String reason; /// Names a parameter of a method or function that, when present, signals that /// the annotated member's value is used by that method or function and does /// not need to be further checked. final String? parameterDefined; /// Initialize a newly created instance to have the given [reason]. const UseResult([this.reason = '']) : parameterDefined = null; /// Initialize a newly created instance to annotate a function or method that /// identifies a parameter [parameterDefined] that when present signals that /// the result is used by the annotated member and does not need to be further /// checked. For values that need to be used unconditionally, use the unnamed /// `UseResult` constructor, or if no reason is specified, the [useResult] /// constant. /// /// Tools, such as the analyzer, can provide feedback if /// /// * a parameter named by [parameterDefined] is not declared by the annotated /// method or function. const UseResult.unless({required this.parameterDefined, this.reason = ''}); } class _AlwaysThrows { const _AlwaysThrows(); } /// See [awaitNotRequired] for more details. @Target({ TargetKind.constructor, TargetKind.field, TargetKind.function, TargetKind.getter, TargetKind.method, TargetKind.topLevelVariable, }) class _AwaitNotRequired { const _AwaitNotRequired(); } class _Checked { const _Checked(); } @Target({ TargetKind.classType, TargetKind.constructor, TargetKind.function, TargetKind.getter, TargetKind.library, TargetKind.method, TargetKind.mixinType, }) class _DoNotStore { const _DoNotStore(); } @Target({ TargetKind.constructor, TargetKind.function, TargetKind.getter, TargetKind.method, TargetKind.optionalParameter, TargetKind.setter, TargetKind.topLevelVariable, }) class _DoNotSubmit { const _DoNotSubmit(); } class _Experimental { const _Experimental(); } @Target({ TargetKind.method, }) class _Factory { const _Factory(); } class _Internal { const _Internal(); } // TODO(srawlins): Enforce with `TargetKind.function` (and // `TargetKind.method`?). class _IsTest { const _IsTest(); } // TODO(srawlins): Enforce with `TargetKind.function` (and // `TargetKind.method`?). class _IsTestGroup { const _IsTestGroup(); } // TODO(srawlins): Enforce with `TargetKind.constructor`. class _Literal { const _Literal(); } @Target({ TargetKind.parameter, TargetKind.extensionType, }) class _MustBeConst { const _MustBeConst(); } @Target({ TargetKind.overridableMember, }) class _MustBeOverridden { const _MustBeOverridden(); } @Target({ TargetKind.overridableMember, }) class _MustCallSuper { const _MustCallSuper(); } // TODO(srawlins): Enforce with `TargetKind.method`, `TargetKind.getter`, // `TargetKind.setter`, `TargetKind.field`. class _NonVirtual { const _NonVirtual(); } @Target({ TargetKind.classType, TargetKind.extension, TargetKind.extensionType, TargetKind.function, TargetKind.method, TargetKind.mixinType, TargetKind.typedefType, }) class _OptionalTypeArgs { const _OptionalTypeArgs(); } // TODO(srawlins): Enforce with `TargetKind.method`, `TargetKind.getter`, // `TargetKind.setter`, `TargetKind.field`. class _Protected { const _Protected(); } @Target({ // TODO(pq): restrict to instance members only TargetKind.getter, TargetKind.setter, TargetKind.method, }) class _Redeclare { const _Redeclare(); } @Target({ TargetKind.classType, TargetKind.mixinType, }) class _Reopen { const _Reopen(); } @Target({ TargetKind.classType, }) class _Sealed { const _Sealed(); } @Deprecated('No longer has meaning') class _Virtual { const _Virtual(); } // TODO(srawlins): Enforce with `TargetKind.method`, `TargetKind.getter`, // `TargetKind.setter`, `TargetKind.field`. class _VisibleForOverriding { const _VisibleForOverriding(); } // TODO(srawlins): Enforce with `TargetKind.constructor`, `TargetKind.function`, // `TargetKind.method`, `TargetKind.getter`, `TargetKind.setter`, // `TargetKind.field`, `TargetKind.parameter`, `TargetKind.typedef`, // `TargetKind.type`. class _VisibleForTesting { const _VisibleForTesting(); }