package org.checkerframework.checker.i18n.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;
import org.checkerframework.framework.qual.LiteralKind;
import org.checkerframework.framework.qual.QualifierForLiterals;
import org.checkerframework.framework.qual.SubtypeOf;

/**
 * Indicates that the {@code String} type has been localized and formatted for the target output
 * locale.
 *
 * @checker_framework.manual #i18n-checker Internationalization Checker
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf(UnknownLocalized.class)
@QualifierForLiterals({
  // All literals except chars and strings, which may need to be localized.
  // (null is bottom by default.)
  LiteralKind.INT,
  LiteralKind.LONG,
  LiteralKind.FLOAT,
  LiteralKind.DOUBLE,
  LiteralKind.BOOLEAN
})
public @interface Localized {}
