blob: 993b90f94880fd77e273d4b335fa7ae2c6b6bb3c [file] [log] [blame]
// Copyright (c) 2025, 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.
/// Annotation for classes that are part of the element model.
///
/// Classes marked with this annotation require some of their members to be
/// annotated, as follows:
///
/// Public getters and fields must be annotated with one of:
/// [trackedIncludedInId]
/// [trackedDirectly]
/// [trackedIndirectly]
///
/// Public methods must be annotated with one of:
/// [trackedDirectly]
/// [trackedIndirectly]
const elementClass = _ElementClass();
/// Annotation for methods that must record the fact of the invocation.
///
/// In contrast to [trackedIncludedInId], the result of the method is not
/// reflected in the ID of the target class, so we need to record this
/// requirement separately.
///
/// Examples: `getMethod(name)`, `getNamedConstructor(name)`.
const trackedDirectly = _TrackedDirectly();
/// As [trackedDirectly], but for methods that are expensive.
///
/// For example, `get methods` adds dependency on all declared methods, but
/// if the client then filters these methods in some way, it would be better
/// to use (or add if absent) a more specific method, e.g. `getMethod(name)`.
///
/// Examples: `constructors`, `methods`.
///
/// We must make sure that the analyzer itself does not use such APIs.
/// We should try to fix any popular lint rules that use such APIs.
const trackedDirectlyExpensive = _TrackedDirectlyExpensive();
/// Annotation for methods that are too invasive, and if invoked for anything
/// other than the current library, disable fine-grained dependencies
/// optimizations. So, the result will be re-computed if just anything in
/// its transitive closure of imported libraries changed.
///
/// Examples: `fragments`, `visitChildren()`.
///
/// We must make sure that the analyzer itself does not use such APIs.
/// We should try to fix any popular lint rules that use such APIs.
const trackedDirectlyOpaque = _TrackedDirectlyOpaque();
/// Annotation for getters that don't require recording.
///
/// The library manifest builder must compare the value of the getter with
/// the previous value in the manifest, and give the element a new ID if the
/// value is different.
///
/// Examples: `isAbstract`, `interfaces`, `returnType`.
const trackedIncludedInId = _TrackedIncludedInId();
/// Annotation for methods that don't require recording.
///
/// The implementation of the method uses only getters and methods which
/// do record requirements, or already would cause a new ID for the target
/// class.
const trackedIndirectly = _TrackedIndirectly();
final class _ElementClass {
const _ElementClass();
}
final class _TrackedDirectly extends _TrackedKind {
const _TrackedDirectly();
}
final class _TrackedDirectlyExpensive extends _TrackedDirectly {
const _TrackedDirectlyExpensive();
}
final class _TrackedDirectlyOpaque extends _TrackedDirectly {
const _TrackedDirectlyOpaque();
}
final class _TrackedIncludedInId extends _TrackedKind {
const _TrackedIncludedInId();
}
final class _TrackedIndirectly extends _TrackedKind {
const _TrackedIndirectly();
}
/// Superclass for all specific kinds of tracking annotations.
sealed class _TrackedKind {
const _TrackedKind();
}