/*
 * 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.annotation.Retention
import kotlin.annotation.Target
import kotlin.reflect.KClass

/**
 * A pattern structure for matching names of classes and interfaces.
 *
 * <p>
 * If no properties are set, the default pattern matches any name of a class or interface.
 */
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class ClassNamePattern(

  /**
   * Define the class-name pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-name:
   * <ul>
   * <li>constant
   * <li>unqualifiedName
   * <li>unqualifiedNamePattern
   * <li>packageName
   * </ul>
   *
   * @return The qualified class name that defines the class.
   */
  val name: String = "",

  /**
   * Define the class-name pattern by reference to a Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-name:
   * <ul>
   * <li>name
   * <li>unqualifiedName
   * <li>unqualifiedNamePattern
   * <li>packageName
   * </ul>
   *
   * @return The class-constant that defines the class.
   */
  val constant: KClass<*> = Object::class,

  /**
   * Exact and unqualified name of the class or interface.
   *
   * <p>
   * For example, the unqualified name of {@code com.example.MyClass} is {@code MyClass}. Note that
   * for inner classes a `$` will appear in the unqualified name,such as, {@code
   * MyClass$MyInnerClass}.
   *
   * <p>
   * The default matches any unqualified name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-unqualified-name:
   * <ul>
   * <li>unqualifiedNamePattern
   * <li>name
   * <li>constant
   * </ul>
   */
  val unqualifiedName: String = "",

  /**
   * Define the unqualified class-name pattern by a string pattern.
   *
   * <p>
   * The default matches any unqualified name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-unqualified-name:
   * <ul>
   * <li>unqualifiedName
   * <li>name
   * <li>constant
   * </ul>
   *
   * @return The string pattern of the unqualified class name.
   */
  val unqualifiedNamePattern: StringPattern = StringPattern(exact = ""),

  /**
   * Exact package name of the class or interface.
   *
   * <p>
   * For example, the package of {@code com.example.MyClass} is {@code com.example}.
   *
   * <p>
   * The default matches any package.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-package-name:
   * <ul>
   * <li>name
   * <li>constant
   * </ul>
   */
  val packageName: String = "",
)
