/*
 * Copyright 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// ***********************************************************************************
// MAINTAINED AND TESTED IN THE R8 REPO. PLEASE MAKE CHANGES THERE AND REPLICATE.
// ***********************************************************************************

package androidx.annotation.keep

/**
 * Usage constraints for how a target is used and what must be kept.
 *
 * <p>Providing the constraints on how an item is being used allows shrinkers to optimize or remove
 * aspects of the item that do not change that usage constraint.
 *
 * <p>For example, invoking a method reflectively does not use any annotations on that method, and
 * it is safe to remove the annotations. However, it would not be safe to remove parameters from the
 * method.
 */
public enum class KeepConstraint {
  /**
   * Indicates that the target item is being looked up reflectively.
   *
   * <p>Looking up an item reflectively requires that it remains on its expected context, which for
   * a method or field means it must remain on its defining class. In other words, the item cannot
   * be removed or moved.
   *
   * <p>Note that looking up a member does not imply that the holder class of the member can be
   * looked up. If both the class and the member need to be looked, make sure to have a target for
   * both.
   *
   * <p>Note also that the item can be looked up within its context but no constraint is placed on
   * its name, accessibility or any other properties of the item.
   *
   * <p>If assumptions are being made about other aspects, additional constraints and targets should
   * be added to the keep annotation.
   */
  LOOKUP,

  /**
   * Indicates that the name of the target item is being used.
   *
   * <p>This usage constraint is needed if the target is being looked up reflectively by using its
   * name. Setting it will prohibit renaming of the target item.
   *
   * <p>Note that preserving the name of a member does not imply that the holder class of the member
   * will preserve its qualified or simple name. If both the class and the member need to preserve
   * their names, make sure to have a target for both.
   *
   * <p>Note that preserving the name of a member does not preserve the types of its parameters or
   * its return type for methods or the type for fields.
   */
  NAME,

  /**
   * Indicates that the visibility of the target must be at least as visible as declared.
   *
   * <p>Setting this constraint ensures that any (reflective) access to the target that is allowed
   * remains valid. In other words, a public class, field or method must remain public. For a
   * non-public target its visibility may be relaxed in the direction: {@code private ->
   * package-private -> protected -> public}.
   *
   * <p>Note that this constraint does not place any restrictions on any other accesses flags than
   * visibility. In particular, flags such a static, final and abstract may change.
   *
   * <p>Used together with {@link #VISIBILITY_RESTRICT} the visibility will remain invariant.
   */
  VISIBILITY_RELAX,

  /**
   * Indicates that the visibility of the target must be at most as visible as declared.
   *
   * <p>Setting this constraint ensures that any (reflective) access to the target that would fail
   * will continue to fail. In other words, a private class, field or method must remain private.
   * Concretely the visibility of the target item may be restricted in the direction: {@code public
   * -> protected -> package-private -> private}.
   *
   * <p>Note that this constraint does not place any restrictions on any other accesses flags than
   * visibility. In particular, flags such a static, final and abstract may change.
   *
   * <p>Used together with {@link #VISIBILITY_RELAX} the visibility will remain invariant.
   */
  VISIBILITY_RESTRICT,

  /**
   * Indicates that the visibility of the target must remain as declared.
   *
   * <p>Note that this constraint does not place any restrictions on any other accesses flags than
   * visibility. In particular, flags such a static, final and abstract may change.
   *
   * <p>This is equivalent to using both {@link #VISIBILITY_RELAX} and {@link #VISIBILITY_RESTRICT}.
   */
  VISIBILITY_INVARIANT,

  /**
   * Indicates that the class target is being instantiated reflectively.
   *
   * <p>This usage constraint is only valid on class targets.
   *
   * <p>Being instantiated prohibits reasoning about the class instances at compile time. In other
   * words, the compiler must assume the class to be possibly instantiated at all times.
   *
   * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain a
   * class. This constraint only implies that if the class is referenced in the program it may be
   * instantiated.
   */
  CLASS_INSTANTIATE,

  /**
   * Indicates that the method target is being invoked reflectively.
   *
   * <p>This usage constraint is only valid on method targets.
   *
   * <p>To be invoked reflectively the method must retain the structure of the method. Thus, unused
   * arguments cannot be removed. However, it does not imply preserving the types of its parameters
   * or its return type. If the parameter types are being obtained reflectively then those need a
   * keep target independent of the method.
   *
   * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain a
   * method reference. This constraint only implies that if the method is referenced in the program
   * it may be reflectively invoked.
   */
  METHOD_INVOKE,

  /**
   * Indicates that the field target is reflectively read from.
   *
   * <p>This usage constraint is only valid on field targets.
   *
   * <p>A field that has its value read from, requires that the field value must remain. Thus, if
   * field remains, its value cannot be replaced. It can still be removed in full, be inlined and
   * its value reasoned about at compile time.
   *
   * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain
   * access to the field. This constraint only implies that if a field is referenced then it may be
   * reflectively read.
   */
  FIELD_GET,

  /**
   * Indicates that the field target is reflectively written to.
   *
   * <p>This usage constraint is only valid on field targets.
   *
   * <p>A field that has its value written to, requires that the field value must be treated as
   * unknown.
   *
   * <p>Note that the constraint {@link KeepConstraint#LOOKUP} is needed to reflectively obtain
   * access to the field. This constraint only implies that if a field is referenced then it may be
   * reflectively written.
   */
  FIELD_SET,

  /**
   * Indicates that the target method can be replaced by an alternative definition at runtime.
   *
   * <p>This usage constraint is only valid on method targets.
   *
   * <p>Replacing a method implies that the concrete implementation of the target cannot be known at
   * compile time. Thus, it cannot be moved or otherwise assumed to have particular properties.
   * Being able to replace the method still allows the compiler to fully remove it if it is
   * statically found to be unused.
   *
   * <p>Note also that no restriction is placed on the method name. To ensure the same name add
   * {@link #NAME} to the constraint set.
   */
  METHOD_REPLACE,

  /**
   * Indicates that the target field can be replaced by an alternative definition at runtime.
   *
   * <p>This usage constraint is only valid on field targets.
   *
   * <p>Replacing a field implies that the concrete implementation of the target cannot be known at
   * compile time. Thus, it cannot be moved or otherwise assumed to have particular properties.
   * Being able to replace the method still allows the compiler to fully remove it if it is
   * statically found to be unused.
   *
   * <p>Note also that no restriction is placed on the field name. To ensure the same name add
   * {@link #NAME} to the constraint set.
   */
  FIELD_REPLACE,

  /**
   * Indicates that the target item must never be inlined or merged.
   *
   * <p>This ensures that if the item is actually used in the program it will remain in some form.
   * For example, a method may still be renamed, but it will be present as a frame in stack traces
   * produced by the runtime (before potentially being retraced). For classes, they too may be
   * renamed, but will not have been merged with other classes or have their allocations fully
   * eliminated (aka class inlining).
   *
   * <p>For members this also ensures that the field value or method body cannot be reasoned about
   * outside the item itself. For example, a field value cannot be assumed to be a particular value,
   * and a method cannot be assumed to have particular properties for callers, such as always
   * throwing or a constant return value.
   */
  NEVER_INLINE,

  /**
   * Indicates that the class hierarchy below the target class may be extended at runtime.
   *
   * <p>This ensures that new subtypes of the target class can later be linked and/or class loaded
   * at runtime.
   *
   * <p>This does not ensure that the class remains if it is otherwise dead code and can be fully
   * removed.
   *
   * <p>Note that this constraint does not ensure that particular methods remain on the target
   * class. If methods or fields of the target class are being targeted by a subclass that was
   * classloaded or linked later, then keep annotations are needed for those targets too. Such
   * non-visible uses requires the same annotations to preserve as for reflective uses.
   */
  CLASS_OPEN_HIERARCHY,

  /**
   * Indicates that the target item must retain its generic signature if present.
   *
   * <p>This ensures that the generic signature remains, but does not prohibit rewriting of the
   * generic signature. For example, if a type present in the generic signature is renamed, the
   * generic signature will also be updated to now refer to the type by its renamed name.
   *
   * <p>Note that this constraint does not otherwise restrict what can be done to the target, such
   * as removing the target completely, inlining it, etc.
   */
  GENERIC_SIGNATURE,
}
