/*
 * @test
 * @summary Test that defaulted types are stored in bytecode.
 *
 * @compile  ../PersistUtil.java Driver.java ReferenceInfoUtil.java Classes.java
 * @run main Driver Classes
 */

import static com.sun.tools.classfile.TypeAnnotation.TargetType.CLASS_TYPE_PARAMETER;
import static com.sun.tools.classfile.TypeAnnotation.TargetType.CLASS_TYPE_PARAMETER_BOUND;

public class Classes {

  /* TODO: store extends/implements in TypesIntoElements.
  @TADescriptions({
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/NonNull", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/initialization/qual/Initialized", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor", type = CLASS_EXTENDS, typeIndex=-1),
  })
  public String extendsDefault1() {
      return "class Test {}";
  }

  @TADescriptions({
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/NonNull", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/initialization/qual/Initialized", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor", type = CLASS_EXTENDS, typeIndex=-1),
  })
  public String extendsDefault2() {
      return "class Test extends Object {}";
  }

  @TADescriptions({
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/NonNull", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/initialization/qual/Initialized", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor", type = CLASS_EXTENDS, typeIndex=-1),
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/NonNull", type = CLASS_EXTENDS, typeIndex=0),
      @TADescription(annotation = "org/checkerframework/checker/initialization/qual/Initialized", type = CLASS_EXTENDS, typeIndex=0),
      @TADescription(annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor", type = CLASS_EXTENDS, typeIndex=0),
  })
  public String extendsDefault3() {
      return "class Test implements java.io.Serializable {}";
  }
  */

  @TADescriptions({
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/Nullable",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
  })
  public String typeParams1() {
    return "class Test <T1> {}";
  }

  @TADescriptions({
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
  })
  public String typeParams2() {
    return "class Test<T1 extends Object> {}";
  }

  @TADescriptions({
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 1),
  })
  public String typeParams3() {
    return "class Test<T2 extends Comparable<T2>> {}";
  }

  @TADescriptions({
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/Nullable",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 0,
        boundIndex = 0),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER,
        paramIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/NonNull",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 1,
        boundIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/initialization/qual/Initialized",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 1,
        boundIndex = 1),
    @TADescription(
        annotation = "org/checkerframework/checker/nullness/qual/UnknownKeyFor",
        type = CLASS_TYPE_PARAMETER_BOUND,
        paramIndex = 1,
        boundIndex = 1),
  })
  public String typeParams4() {
    return "class Test<T1, T2 extends Comparable<T2>> {}";
  }
}
