import checkers.nullness.quals.*; import checkers.quals.*; import java.util.*; public class DefaultAnnotation { public void testNoDefault() { String s = null; } @DefaultQualifiers(@DefaultQualifier(value="checkers.nullness.quals.NonNull", locations={DefaultLocation.ALL})) public void testDefault() { String s = null; // error List<String> lst = new List<String>(); // valid lst.add(null); // error } @DefaultQualifier(value="checkers.nullness.quals.NonNull", locations={DefaultLocation.ALL}) public class InnerDefault { public void testDefault() { String s = null; // error List<String> lst = new List<String>(); // valid lst.add(null); // error s = lst.get(0); // valid List<@Nullable String> nullList = new List<@Nullable String>(); // valid nullList.add(null); // valid s = nullList.get(0); // error } } @DefaultQualifier(value="checkers.nullness.quals.NonNull", locations={DefaultLocation.ALL}) public static class DefaultDefs { public String getNNString() { return "foo"; // valid } public String getNNString2() { return null; // error } public <T extends @Nullable Object> T getNull(T t) { return null; // invalid } public <T extends @NonNull Object> T getNonNull(T t) { return null; // error } } public class DefaultUses { public void test() { DefaultDefs d = new DefaultDefs(); @NonNull String s = d.getNNString(); // valid } @DefaultQualifier(value="checkers.nullness.quals.NonNull", locations={DefaultLocation.ALL}) public void testDefaultArgs() { DefaultDefs d = new DefaultDefs(); String s1 = d.<@Nullable String>getNull(null); // error String s2 = d.<String>getNonNull("foo"); // valid String s3 = d.<@Nullable String>getNonNull("foo"); // error } } @DefaultQualifier(value="checkers.nullness.quals.NonNull") static class DefaultExtends implements Iterator<String>, Iterable<String> { @Override public boolean hasNext() { throw new UnsupportedOperationException(); } @Override public void remove() { throw new UnsupportedOperationException(); } @Override public String next() { throw new UnsupportedOperationException(); } @Override public Iterator<String> iterator() { return this; } } class List<E extends @Nullable Object> { public E get(int i) { throw new RuntimeException(); } public boolean add(E e) { throw new RuntimeException(); } } @DefaultQualifier(value="NonNull") public void testDefaultUnqualified() { String s = null; // error List<String> lst = new List<String>(); // valid lst.add(null); // error } }