// 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();
}
