package annotator.tests;

public class ExtImpl {
  class Top<X, Y> {}
  interface Iface<A, B> {}
  interface Iface2<C, D> {}
  interface Iface3 {}
  interface Iface4<T, @org.checkerframework.checker.nullness.qual.NonNull S extends @org.checkerframework.checker.nullness.qual.NonNull @org.checkerframework.checker.nullness.qual.UnknownKeyFor Iface4<T, S>> {}

  class C1 extends @A Top<@B Object, @C String> implements @D Iface<@E Integer, @F String> {}

  class C2 implements @A Iface<@B String, @C Object>, @D Iface2<@E Object, @F Float> {}

  class C3 {
    class Iface3 implements annotator.tests.ExtImpl.Iface3 {}

    /*
     * the jaif file  says that the simple name of
     * the return type in JVM format is
     * LIface3;
     */
    @java.lang.SuppressWarnings({})
    annotator.tests.ExtImpl.C3.Iface3 getI1() {
      return null;
    }

    /*
     * in this case, the jaif file uses the fully qualified name
     * for the return type
     * Lannotator.tests.ExtImpl.C3.Iface3;
     */
    @java.lang.SuppressWarnings({})
    annotator.tests.ExtImpl.C3.Iface3 getI2() {
      return null;
    }

    /*
     * the jaif file uses the simple name of the return type
     * LC3$Iface3;
     */
    @java.lang.SuppressWarnings({})
    Iface3 getI3() {
      return null;
    }

    /*
     * in the jaif file, the return type is Iface3
     * (ambiguous: could be short for the interface
     * annotator.tests.ExtImpl.Iface3)
     */
    @java.lang.SuppressWarnings({})
    Iface3 getI4() {
      return null;
    }
  }
}