package org.checkerframework.framework.qual;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * A meta-annotation applied to the declaration of a type qualifier. It specifies that the given
 * annotation should be the default for:
 *
 * <ul>
 *   <li>all uses at a particular location,
 *   <li>all uses of a particular type, and
 *   <li>all uses of a particular kind of type.
 * </ul>
 *
 * <p>The default applies to every match for any of this annotation's conditions.
 *
 * @see TypeUseLocation
 * @see DefaultQualifier
 * @see DefaultQualifierInHierarchy
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface DefaultFor {
  /**
   * Returns the locations to which the annotation should be applied.
   *
   * @return the locations to which the annotation should be applied
   */
  TypeUseLocation[] value() default {};

  /**
   * Returns {@link TypeKind}s of types for which an annotation should be implicitly added.
   *
   * @return {@link TypeKind}s of types for which an annotation should be implicitly added
   */
  TypeKind[] typeKinds() default {};

  /**
   * Returns {@link Class}es for which an annotation should be applied. For example, if
   * {@code @MyAnno} is meta-annotated with {@code @DefaultFor(classes=String.class)}, then every
   * occurrence of {@code String} is actually {@code @MyAnno String}.
   *
   * @return {@link Class}es for which an annotation should be applied
   */
  Class<?>[] types() default {};

  /**
   * Returns regular expressions matching names of variables, to whose types the annotation should
   * be applied as a default. If a regular expression matches the name of a method, the annotation
   * is applied as a default to the return type.
   *
   * <p>The regular expression must match the entire variable or method name. For example, to match
   * any name that contains "foo", use ".*foo.*".
   *
   * <p>The default does not apply if the name matches any of the regexes in {@link
   * #namesExceptions}.
   *
   * <p>This affects formal parameter types only if one of the following is true:
   *
   * <ul>
   *   <li>The method's source code is available; that is, the method is type-checked along with
   *       client calls.
   *   <li>When the method was compiled in a previous run of javac, either the processor was run or
   *       the {@code -g} command-line option was provided.
   * </ul>
   *
   * @return regular expressions matching variables to whose type an annotation should be applied
   */
  String[] names() default {};

  /**
   * Returns exceptions to regular expression rules.
   *
   * @return exceptions to regular expression rules
   * @see #names
   */
  String[] namesExceptions() default {};
}
