/*
 * 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 target for a keep edge.
 *
 * <p>
 * The target denotes an item along with options for what to keep. An item can be:
 * <ul>
 * <li>a pattern on classes;
 * <li>a pattern on methods; or
 * <li>a pattern on fields.
 * </ul>
 */
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class KeepTarget(

  /**
   * Specify the kind of this item pattern.
   *
   * <p>
   * Possible values are:
   * <ul>
   * <li>{@link KeepItemKind#ONLY_CLASS}
   * <li>{@link KeepItemKind#ONLY_MEMBERS}
   * <li>{@link KeepItemKind#ONLY_METHODS}
   * <li>{@link KeepItemKind#ONLY_FIELDS}
   * <li>{@link KeepItemKind#CLASS_AND_MEMBERS}
   * <li>{@link KeepItemKind#CLASS_AND_METHODS}
   * <li>{@link KeepItemKind#CLASS_AND_FIELDS}
   * </ul>
   *
   * <p>
   * If unspecified the default kind for an item depends on its member patterns:
   * <ul>
   * <li>{@link KeepItemKind#ONLY_CLASS} if no member patterns are defined
   * <li>{@link KeepItemKind#ONLY_METHODS} if method patterns are defined
   * <li>{@link KeepItemKind#ONLY_FIELDS} if field patterns are defined
   * <li>{@link KeepItemKind#ONLY_MEMBERS} otherwise.
   * </ul>
   *
   * @return The kind for this pattern.
   */
  val kind: KeepItemKind = KeepItemKind.DEFAULT,

  /**
   * Define the usage constraints of the target.
   *
   * <p>
   * The specified constraints must remain valid for the target.
   *
   * <p>
   * The default constraints depend on the kind of the target. For all targets the default
   * constraints include:
   * <ul>
   * <li>{@link KeepConstraint#LOOKUP}
   * <li>{@link KeepConstraint#NAME}
   * <li>{@link KeepConstraint#VISIBILITY_RELAX}
   * </ul>
   *
   * <p>
   * For classes the default constraints also include:
   * <ul>
   * <li>{@link KeepConstraint#CLASS_INSTANTIATE}
   * </ul>
   *
   * <p>
   * For methods the default constraints also include:
   * <ul>
   * <li>{@link KeepConstraint#METHOD_INVOKE}
   * </ul>
   *
   * <p>
   * For fields the default constraints also include:
   * <ul>
   * <li>{@link KeepConstraint#FIELD_GET}
   * <li>{@link KeepConstraint#FIELD_SET}
   * </ul>
   *
   * <p>
   * Mutually exclusive with the property `constraintAdditions` also defining constraints.
   *
   * @return Usage constraints for the target.
   */
  val constraints: Array<KeepConstraint> = [],

  /**
   * Add additional usage constraints of the target.
   *
   * <p>
   * The specified constraints must remain valid for the target in addition to the default
   * constraints.
   *
   * <p>
   * The default constraints are documented in {@link #constraints}
   *
   * <p>
   * Mutually exclusive with the property `constraints` also defining constraints.
   *
   * @return Additional usage constraints for the target.
   */
  val constraintAdditions: Array<KeepConstraint> = [],

  /**
   * Patterns for annotations that must remain on the item.
   *
   * <p>
   * The annotations matching any of the patterns must remain on the item if the annotation types
   * remain in the program.
   *
   * <p>
   * Note that if the annotation types themselves are unused/removed, then their references on the
   * item will be removed too. If the annotation types themselves are used reflectively then they
   * too need a keep annotation or rule to ensure they remain in the program.
   *
   * <p>
   * By default no annotation patterns are defined and no annotations are required to remain.
   *
   * @return Annotation patterns
   */
  val constrainAnnotations: Array<AnnotationPattern> = [],

  /**
   * Define the class pattern by reference to a binding.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class:
   * <ul>
   * <li>className
   * <li>classConstant
   * <li>classNamePattern
   * <li>instanceOfClassName
   * <li>instanceOfClassNameExclusive
   * <li>instanceOfClassConstant
   * <li>instanceOfClassConstantExclusive
   * <li>instanceOfPattern
   * <li>classAnnotatedByClassName
   * <li>classAnnotatedByClassConstant
   * <li>classAnnotatedByClassNamePattern
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class.
   *
   * @return The name of the binding that defines the class.
   */
  val classFromBinding: String = "",

  /**
   * Define the class-name pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-name:
   * <ul>
   * <li>classConstant
   * <li>classNamePattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class name.
   *
   * @return The qualified class name that defines the class.
   */
  val className: 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>className
   * <li>classNamePattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class name.
   *
   * @return The class-constant that defines the class.
   */
  val classConstant: KClass<*> = Object::class,

  /**
   * Define the class-name pattern by reference to a class-name pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-name:
   * <ul>
   * <li>className
   * <li>classConstant
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class name.
   *
   * @return The class-name pattern that defines the class.
   */
  val classNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),

  /**
   * Define the instance-of pattern as classes that are instances of the fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining instance-of:
   * <ul>
   * <li>instanceOfClassNameExclusive
   * <li>instanceOfClassConstant
   * <li>instanceOfClassConstantExclusive
   * <li>instanceOfPattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class instance.
   *
   * @return The qualified class name that defines what instance-of the class must be.
   */
  val instanceOfClassName: String = "",

  /**
   * Define the instance-of pattern as classes that are instances of the fully qualified class name.
   *
   * <p>
   * The pattern is exclusive in that it does not match classes that are instances of the pattern,
   * but only those that are instances of classes that are subclasses of the pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining instance-of:
   * <ul>
   * <li>instanceOfClassName
   * <li>instanceOfClassConstant
   * <li>instanceOfClassConstantExclusive
   * <li>instanceOfPattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class instance.
   *
   * @return The qualified class name that defines what instance-of the class must be.
   */
  val instanceOfClassNameExclusive: String = "",

  /**
   * Define the instance-of pattern as classes that are instances the referenced Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining instance-of:
   * <ul>
   * <li>instanceOfClassName
   * <li>instanceOfClassNameExclusive
   * <li>instanceOfClassConstantExclusive
   * <li>instanceOfPattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class instance.
   *
   * @return The class constant that defines what instance-of the class must be.
   */
  val instanceOfClassConstant: KClass<*> = Object::class,

  /**
   * Define the instance-of pattern as classes that are instances the referenced Class constant.
   *
   * <p>
   * The pattern is exclusive in that it does not match classes that are instances of the pattern,
   * but only those that are instances of classes that are subclasses of the pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining instance-of:
   * <ul>
   * <li>instanceOfClassName
   * <li>instanceOfClassNameExclusive
   * <li>instanceOfClassConstant
   * <li>instanceOfPattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class instance.
   *
   * @return The class constant that defines what instance-of the class must be.
   */
  val instanceOfClassConstantExclusive: KClass<*> = Object::class,

  /**
   * Define the instance-of with a pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining instance-of:
   * <ul>
   * <li>instanceOfClassName
   * <li>instanceOfClassNameExclusive
   * <li>instanceOfClassConstant
   * <li>instanceOfClassConstantExclusive
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class instance.
   *
   * @return The pattern that defines what instance-of the class must be.
   */
  val instanceOfPattern: InstanceOfPattern = InstanceOfPattern(),

  /**
   * Define the class-annotated-by pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-annotated-by:
   * <ul>
   * <li>classAnnotatedByClassConstant
   * <li>classAnnotatedByClassNamePattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class regardless of what the class is
   * annotated by.
   *
   * @return The qualified class name that defines the annotation.
   */
  val classAnnotatedByClassName: String = "",

  /**
   * Define the class-annotated-by pattern by reference to a Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-annotated-by:
   * <ul>
   * <li>classAnnotatedByClassName
   * <li>classAnnotatedByClassNamePattern
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class regardless of what the class is
   * annotated by.
   *
   * @return The class-constant that defines the annotation.
   */
  val classAnnotatedByClassConstant: KClass<*> = Object::class,

  /**
   * Define the class-annotated-by pattern by reference to a class-name pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining class-annotated-by:
   * <ul>
   * <li>classAnnotatedByClassName
   * <li>classAnnotatedByClassConstant
   * <li>classFromBinding
   * </ul>
   *
   * <p>
   * If none are specified the default is to match any class regardless of what the class is
   * annotated by.
   *
   * @return The class-name pattern that defines the annotation.
   */
  val classAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),

  /**
   * Define the member pattern in full by a reference to a binding.
   *
   * <p>
   * Mutually exclusive with all other class and member pattern properties. When a member binding is
   * referenced this item is defined to be that item, including its class and member patterns.
   *
   * @return The binding name that defines the member.
   */
  val memberFromBinding: String = "",

  /**
   * Define the member-annotated-by pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining member-annotated-by:
   * <ul>
   * <li>memberAnnotatedByClassConstant
   * <li>memberAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field and method properties as use restricts the match to both
   * types of members.
   *
   * <p>
   * If none are specified the default is to match any member regardless of what the member is
   * annotated by.
   *
   * @return The qualified class name that defines the annotation.
   */
  val memberAnnotatedByClassName: String = "",

  /**
   * Define the member-annotated-by pattern by reference to a Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining member-annotated-by:
   * <ul>
   * <li>memberAnnotatedByClassName
   * <li>memberAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field and method properties as use restricts the match to both
   * types of members.
   *
   * <p>
   * If none are specified the default is to match any member regardless of what the member is
   * annotated by.
   *
   * @return The class-constant that defines the annotation.
   */
  val memberAnnotatedByClassConstant: KClass<*> = Object::class,

  /**
   * Define the member-annotated-by pattern by reference to a class-name pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining member-annotated-by:
   * <ul>
   * <li>memberAnnotatedByClassName
   * <li>memberAnnotatedByClassConstant
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field and method properties as use restricts the match to both
   * types of members.
   *
   * <p>
   * If none are specified the default is to match any member regardless of what the member is
   * annotated by.
   *
   * @return The class-name pattern that defines the annotation.
   */
  val memberAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),

  /**
   * Define the member-access pattern by matching on access flags.
   *
   * <p>
   * Mutually exclusive with all field and method properties as use restricts the match to both
   * types of members.
   *
   * <p>
   * Mutually exclusive with the property `memberFromBinding` also defining member-access.
   *
   * @return The member access-flag constraints that must be met.
   */
  val memberAccess: Array<MemberAccessFlags> = [],

  /**
   * Define the method-annotated-by pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining method-annotated-by:
   * <ul>
   * <li>methodAnnotatedByClassConstant
   * <li>methodAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none are specified the default is to match any method regardless of what the method is
   * annotated by.
   *
   * @return The qualified class name that defines the annotation.
   */
  val methodAnnotatedByClassName: String = "",

  /**
   * Define the method-annotated-by pattern by reference to a Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining method-annotated-by:
   * <ul>
   * <li>methodAnnotatedByClassName
   * <li>methodAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none are specified the default is to match any method regardless of what the method is
   * annotated by.
   *
   * @return The class-constant that defines the annotation.
   */
  val methodAnnotatedByClassConstant: KClass<*> = Object::class,

  /**
   * Define the method-annotated-by pattern by reference to a class-name pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining method-annotated-by:
   * <ul>
   * <li>methodAnnotatedByClassName
   * <li>methodAnnotatedByClassConstant
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none are specified the default is to match any method regardless of what the method is
   * annotated by.
   *
   * @return The class-name pattern that defines the annotation.
   */
  val methodAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),

  /**
   * Define the method-access pattern by matching on access flags.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any
   * method-access flags.
   *
   * <p>
   * Mutually exclusive with the property `memberFromBinding` also defining method-access.
   *
   * @return The method access-flag constraints that must be met.
   */
  val methodAccess: Array<MethodAccessFlags> = [],

  /**
   * Define the method-name pattern by an exact method name.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any method
   * name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining method-name:
   * <ul>
   * <li>methodNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return The exact method name of the method.
   */
  val methodName: String = "",

  /**
   * Define the method-name pattern by a string pattern.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any method
   * name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining method-name:
   * <ul>
   * <li>methodName
   * <li>memberFromBinding
   * </ul>
   *
   * @return The string pattern of the method name.
   */
  val methodNamePattern: StringPattern = StringPattern(exact = ""),

  /**
   * Define the method return-type pattern by a fully qualified type or 'void'.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any return
   * type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining return-type:
   * <ul>
   * <li>methodReturnTypeConstant
   * <li>methodReturnTypePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return The qualified type name of the method return type.
   */
  val methodReturnType: String = "",

  /**
   * Define the method return-type pattern by a class constant.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any return
   * type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining return-type:
   * <ul>
   * <li>methodReturnType
   * <li>methodReturnTypePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return A class constant denoting the type of the method return type.
   */
  val methodReturnTypeConstant: KClass<*> = Object::class,

  /**
   * Define the method return-type pattern by a type pattern.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any return
   * type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining return-type:
   * <ul>
   * <li>methodReturnType
   * <li>methodReturnTypeConstant
   * <li>memberFromBinding
   * </ul>
   *
   * @return The pattern of the method return type.
   */
  val methodReturnTypePattern: TypePattern = TypePattern(name = ""),

  /**
   * Define the method parameters pattern by a list of fully qualified types.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any parameters.
   *
   * <p>
   * Mutually exclusive with the following other properties defining parameters:
   * <ul>
   * <li>methodParameterTypePatterns
   * <li>memberFromBinding
   * </ul>
   *
   * @return The list of qualified type names of the method parameters.
   */
  val methodParameters: Array<String> = [""],

  /**
   * Define the method parameters pattern by a list of patterns on types.
   *
   * <p>
   * Mutually exclusive with all field properties.
   *
   * <p>
   * If none, and other properties define this item as a method, the default matches any parameters.
   *
   * <p>
   * Mutually exclusive with the following other properties defining parameters:
   * <ul>
   * <li>methodParameters
   * <li>memberFromBinding
   * </ul>
   *
   * @return The list of type patterns for the method parameters.
   */
  val methodParameterTypePatterns: Array<TypePattern> = [TypePattern(name = "")],

  /**
   * Define the field-annotated-by pattern by fully qualified class name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-annotated-by:
   * <ul>
   * <li>fieldAnnotatedByClassConstant
   * <li>fieldAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none are specified the default is to match any field regardless of what the field is
   * annotated by.
   *
   * @return The qualified class name that defines the annotation.
   */
  val fieldAnnotatedByClassName: String = "",

  /**
   * Define the field-annotated-by pattern by reference to a Class constant.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-annotated-by:
   * <ul>
   * <li>fieldAnnotatedByClassName
   * <li>fieldAnnotatedByClassNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none are specified the default is to match any field regardless of what the field is
   * annotated by.
   *
   * @return The class-constant that defines the annotation.
   */
  val fieldAnnotatedByClassConstant: KClass<*> = Object::class,

  /**
   * Define the field-annotated-by pattern by reference to a class-name pattern.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-annotated-by:
   * <ul>
   * <li>fieldAnnotatedByClassName
   * <li>fieldAnnotatedByClassConstant
   * <li>memberFromBinding
   * </ul>
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none are specified the default is to match any field regardless of what the field is
   * annotated by.
   *
   * @return The class-name pattern that defines the annotation.
   */
  val fieldAnnotatedByClassNamePattern: ClassNamePattern = ClassNamePattern(unqualifiedName = ""),

  /**
   * Define the field-access pattern by matching on access flags.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any field-access
   * flags.
   *
   * <p>
   * Mutually exclusive with the property `memberFromBinding` also defining field-access.
   *
   * @return The field access-flag constraints that must be met.
   */
  val fieldAccess: Array<FieldAccessFlags> = [],

  /**
   * Define the field-name pattern by an exact field name.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any field name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-name:
   * <ul>
   * <li>fieldNamePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return The exact field name of the field.
   */
  val fieldName: String = "",

  /**
   * Define the field-name pattern by a string pattern.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any field name.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-name:
   * <ul>
   * <li>fieldName
   * <li>memberFromBinding
   * </ul>
   *
   * @return The string pattern of the field name.
   */
  val fieldNamePattern: StringPattern = StringPattern(exact = ""),

  /**
   * Define the field-type pattern by a fully qualified type.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-type:
   * <ul>
   * <li>fieldTypeConstant
   * <li>fieldTypePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return The qualified type name for the field type.
   */
  val fieldType: String = "",

  /**
   * Define the field-type pattern by a class constant.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-type:
   * <ul>
   * <li>fieldType
   * <li>fieldTypePattern
   * <li>memberFromBinding
   * </ul>
   *
   * @return The class constant for the field type.
   */
  val fieldTypeConstant: KClass<*> = Object::class,

  /**
   * Define the field-type pattern by a pattern on types.
   *
   * <p>
   * Mutually exclusive with all method properties.
   *
   * <p>
   * If none, and other properties define this item as a field, the default matches any type.
   *
   * <p>
   * Mutually exclusive with the following other properties defining field-type:
   * <ul>
   * <li>fieldType
   * <li>fieldTypeConstant
   * <li>memberFromBinding
   * </ul>
   *
   * @return The type pattern for the field type.
   */
  val fieldTypePattern: TypePattern = TypePattern(name = ""),
)
