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

import kotlin.reflect.KClass

/**
 * The annotated code uses reflection to indirectly access a method of the specified
 * class/interface, or its subclasses / interface implementers.
 *
 * This annotation indicates to optimizers or shrinkers that the target method should be preserved
 * if the annotated code is reachable in the final application build.
 *
 * @see UsesReflectionToConstruct
 * @see UsesReflectionToAccessField
 */
@Repeatable
@Retention(AnnotationRetention.BINARY)
@Target(
    AnnotationTarget.CLASS,
    AnnotationTarget.FIELD,
    AnnotationTarget.FUNCTION,
    AnnotationTarget.CONSTRUCTOR,
)
public annotation class UsesReflectionToAccessMethod(

    /**
     * Class containing the method accessed by reflection.
     *
     * Mutually exclusive with [className].
     */
    val classConstant: KClass<*> = Unspecified::class,

    /**
     * Class name (or class name pattern) containing the method accessed by reflection.
     *
     * Mutually exclusive with [classConstant].
     */
    val className: String = "",

    /** Name (or name pattern) of method accessed by reflection. */
    val methodName: String,

    /**
     * Defines which method to keep by specifying set of parameter classes passed.
     *
     * If neither `param` nor `paramTypeNames` is specified then methods with all parameter lists
     * are kept.
     *
     * Mutually exclusive with [paramTypeNames].
     */
    val params: Array<KClass<*>> = [Unspecified::class],

    /**
     * Defines which method to keep by specifying set of parameter classes passed.
     *
     * If neither `param` nor `paramTypeNames` is specified then methods with all parameter lists
     * are kept.
     *
     * Mutually exclusive with [params].
     */
    val paramTypeNames: Array<String> = [""],

    /**
     * Return type of the method accessed by reflection.
     *
     * Ignored if not specified.
     *
     * Mutually exclusive with [returnTypeName].
     */
    val returnType: KClass<*> = Unspecified::class,

    /**
     * Return type (or type pattern) of the method accessed by reflection.
     *
     * Ignored if not specified.
     *
     * Mutually exclusive with [returnType].
     */
    val returnTypeName: String = "",
)
