// This is a test case for issue 2247:
// https://github.com/typetools/checker-framework/issues/2247

import java.util.List;
import java.util.Map;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;

public class Issue2247 {

  static @NonNull class DeclaredClass {}

  class ValidUseType {

    // :: error: (annotations.on.use)
    void test1(@Nullable DeclaredClass object) {}

    // :: error: (annotations.on.use)
    @Nullable DeclaredClass test2() {
      return null;
    }

    // :: error: (annotations.on.use)
    void test3(List<@Nullable DeclaredClass> param) {
      @Nullable DeclaredClass object = null;
      // :: error: (annotations.on.use)
      @Nullable DeclaredClass[] array = null;
    }

    // :: error: (annotations.on.use)
    <T extends @Nullable DeclaredClass> void test4(@NonNull T t) {}

    void test5(Map<String, DeclaredClass> map) {
      @Nullable DeclaredClass value = map.get("somekey");
      System.out.println(value);
      if (value != null) {
        @NonNull DeclaredClass nonnull = value;
      }
    }
  }
}
