/*
 * 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.
 */

// ***********************************************************************************
// GENERATED FILE. DO NOT EDIT! See KeepItemAnnotationGenerator.java.
// ***********************************************************************************

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

package androidx.annotation.keep

/**
 * Indicates code which is accessed by references from outside of the application code directly,
 * such as via JNI, reflection, or instantiation from platform framework code.
 *
 * NOTE: This keep rule is unconditional, meaning that the annotated class, method, or field will
 * always be preserved in the final application even if, for example, the surrounding code is never
 * used.
 *
 * If reflection or JNI access occurs inside the application, instead prefer the
 * `@UsesReflection***` annotations, as they will keep conditionally, rather than unconditionally as
 * this annotation does.
 *
 * @see UsesReflectionToConstruct
 * @see UsesReflectionToAccessMethod
 * @see UsesReflectionToAccessField
 */
@Retention(AnnotationRetention.BINARY)
@Target(
    AnnotationTarget.CLASS,
    AnnotationTarget.FIELD,
    AnnotationTarget.FUNCTION,
    AnnotationTarget.CONSTRUCTOR,
    AnnotationTarget.PROPERTY,
    AnnotationTarget.PROPERTY_GETTER,
    AnnotationTarget.PROPERTY_SETTER,
)
public annotation class UnconditionallyKeep(

    /**
     * Should the name be preserved.
     *
     * Generally this is true if the reference is external, but this can be disabled if the name
     * isn't important.
     */
    val shouldPreserveName: Boolean = true
)
