import java.io.*;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.regex.*;
import org.checkerframework.checker.nullness.qual.*;
import org.checkerframework.framework.qual.DefaultQualifier;

@DefaultQualifier(NonNull.class)
public class ExpressionsNullness {

  public static double[] returnDoubleArray() {
    return new double[] {3.14, 2.7};
  }

  public static void staticMembers() {
    Pattern.compile("^>entry *()");
    System.out.println(ExpressionsNullness.class);
    ExpressionsNullness.class.getAnnotations(); // valid
  }

  private HashMap<String, String> map = new HashMap<>();

  public void test() {
    @SuppressWarnings("nullness")
    String s = map.get("foo");

    Class<?> cl = Boolean.TYPE;

    List<?> foo = new LinkedList<Object>();
    // :: error: (dereference.of.nullable)
    foo.get(0).toString(); // default applies to wildcard extends

    Set set = new HashSet();
    for (@Nullable Object o : set) System.out.println();
  }

  void test2() {
    List<? extends @NonNull String> lst = new LinkedList<@NonNull String>();
    for (String s : lst) {
      s.length();
    }
  }

  <T extends @NonNull Object> void test3(T o) {
    o.getClass(); // valid
  }

  void test4(List<? extends @NonNull Object> o) {
    o.get(0).getClass(); // valid
  }

  void test5() {
    Comparable<Date> d = new Date();
  }

  void testIntersection() {
    java.util.Arrays.asList("m", 1);
  }

  Object obj;

  public ExpressionsNullness(Object obj) {
    this.obj = obj;
  }
}
