package org.checkerframework.framework.source;

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

/**
 * Specifies the prefixes or checkernames that suppress warnings issued by this checker. When used
 * as the argument to {@link SuppressWarnings}, any of the given arguments suppresses all warnings
 * related to the checker. They can also be used as a prefix, followed by a colon and a message key.
 *
 * <p>In order for this annotation to have an effect, it must be placed on the declaration of a
 * class that extends {@link SourceChecker}.
 *
 * <p>If this annotation is not present on a checker class, then the lowercase name of the checker
 * is used by default. The name of the checker is the part of the checker classname that comes
 * before "Checker" or "Subchecker". If the checker classname is not of this form, then the
 * classname is the checker name.)
 *
 * @checker_framework.manual #suppresswarnings-annotation-syntax
 * @deprecated Use {@link SuppressWarningsPrefix} instead.
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Inherited
@Deprecated // 2020-06-26
// In the manual section #suppresswarnings-annotation-syntax, the term checkername is used instead
// of prefix.
public @interface SuppressWarningsKeys {

  /**
   * Returns array of strings, any one of which causes this checker to suppress a warning when
   * passed as the argument of {@literal @}{@link SuppressWarnings}.
   *
   * @return array of strings, any one of which causes this checker to suppress a warning when
   *     passed as the argument of {@literal @}{@link SuppressWarnings}
   */
  String[] value();
}
