import java.util.List;
import org.checkerframework.checker.guieffect.qual.AlwaysSafe;
import org.checkerframework.checker.guieffect.qual.PolyUIType;
import org.checkerframework.checker.guieffect.qual.UI;

public class ThrowCatchTest {
  // Default type of List's type parameter is below @UI so these
  // fields are type.argument.incompatible
  // :: error: (type.argument)
  List<? extends @UI Object> ooo;

  // :: error: (type.argument) :: error: (annotations.on.use)
  List<? extends @UI Inner> iii;

  class Inner {}

  boolean flag = true;
  // Type var test
  <E extends @UI PolyUIException> void throwTypeVarUI1(E ex1, @UI E ex2) throws PolyUIException {
    if (flag) {
      // :: error: (throw)
      throw ex1;
    }
    // :: error: (throw)
    throw ex2;
  }

  <@UI E extends @UI PolyUIException> void throwTypeVarUI2(E ex1) throws PolyUIException {
    // :: error: (throw)
    throw ex1;
  }

  <E extends @AlwaysSafe PolyUIException> void throwTypeVarAlwaysSafe1(E ex1, @AlwaysSafe E ex2)
      throws PolyUIException {
    if (flag) {
      throw ex1;
    }
    throw ex2;
  }

  <@AlwaysSafe E extends PolyUIException> void throwTypeVarAlwaysSafe2(E ex1, @AlwaysSafe E ex2)
      throws PolyUIException {
    if (flag) {
      throw ex1;
    }
    throw ex2;
  }

  <@AlwaysSafe E extends @UI PolyUIException> void throwTypeVarMixed(E ex1, @AlwaysSafe E ex2)
      throws PolyUIException {
    if (flag) {
      // :: error: (throw)
      throw ex1;
    }
    throw ex2;
  }

  // Wildcards
  void throwWildcard(
      // :: error: (type.argument)
      List<? extends @UI PolyUIException>
          ui, // Default type of List's type parameter is below @UI so this is
      // type.argument.incompatible
      List<? extends @AlwaysSafe PolyUIException> alwaysSafe)
      throws PolyUIException {
    if (flag) {
      // :: error: (throw)
      throw ui.get(0);
    }
    throw alwaysSafe.get(0);
  }

  void throwNull() {
    throw null;
  }

  // Declared
  @UI PolyUIException ui = new PolyUIException();
  @AlwaysSafe PolyUIException alwaysSafe = new PolyUIException();

  void throwDeclared() {
    try {
      // :: error: (throw)
      throw ui;
    } catch (@UI PolyUIException UIParam) {

    }

    try {
      throw alwaysSafe;
    } catch (@AlwaysSafe PolyUIException alwaysSafeParam) {

    }
  }

  // Test Exception parameters
  void unionTypes() {
    try {
    } catch (
        @AlwaysSafe NullPointerPolyUIException
        | @AlwaysSafe ArrayStorePolyUIException unionParam) {

    }

    try {
    } catch (@UI NullPointerPolyUIException | @UI ArrayStorePolyUIException unionParam) {

    }
  }

  void defaults() {
    try {
      throw new PolyUIException();
    } catch (PolyUIException e) {

    }
  }

  @PolyUIType
  class PolyUIException extends Exception {}

  @PolyUIType
  class NullPointerPolyUIException extends NullPointerException {}

  @PolyUIType
  class ArrayStorePolyUIException extends ArrayStoreException {}
}
