From 50e2d999b3b307b3426f69d2871e7072a38bfe4e Mon Sep 17 00:00:00 2001 From: Chris Povirk Date: Fri, 20 May 2022 12:55:46 -0400 Subject: [PATCH] Write `extends @NonNull Object` instead of `extends Object`. The simpler formulation doesn't work in stub files, even in JDK stubs. (This is typetools bug number 3030.) I tested against a file with the call: ``` java.util.List.of("", null); ``` --- .../share/classes/java/util/List.java | 25 +++++++++--------- .../share/classes/java/util/Map.java | 26 +++++++++---------- .../share/classes/java/util/Set.java | 25 +++++++++--------- .../util/concurrent/ArrayBlockingQueue.java | 2 +- .../util/concurrent/LinkedBlockingDeque.java | 2 +- .../util/concurrent/LinkedBlockingQueue.java | 2 +- .../concurrent/PriorityBlockingQueue.java | 2 +- .../classes/java/util/stream/Collectors.java | 23 ++++++++-------- 8 files changed, 55 insertions(+), 52 deletions(-) diff --git a/src/java.base/share/classes/java/util/List.java b/src/java.base/share/classes/java/util/List.java index 0fce0b77ec3..db22723560c 100644 --- a/src/java.base/share/classes/java/util/List.java +++ b/src/java.base/share/classes/java/util/List.java @@ -31,6 +31,7 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.lock.qual.GuardSatisfied; import org.checkerframework.checker.lock.qual.ReleasesNoLocks; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.dataflow.qual.Pure; @@ -835,7 +836,7 @@ static List of() { * * @since 9 */ - static List of(E e1) { + static List of(E e1) { return new ImmutableCollections.List12<>(e1); } @@ -852,7 +853,7 @@ static List of(E e1) { * * @since 9 */ - static List of(E e1, E e2) { + static List of(E e1, E e2) { return new ImmutableCollections.List12<>(e1, e2); } @@ -870,7 +871,7 @@ static List of(E e1, E e2) { * * @since 9 */ - static List of(E e1, E e2, E e3) { + static List of(E e1, E e2, E e3) { return new ImmutableCollections.ListN<>(e1, e2, e3); } @@ -889,7 +890,7 @@ static List of(E e1, E e2, E e3) { * * @since 9 */ - static List of(E e1, E e2, E e3, E e4) { + static List of(E e1, E e2, E e3, E e4) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4); } @@ -909,7 +910,7 @@ static List of(E e1, E e2, E e3, E e4) { * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5) { + static List of(E e1, E e2, E e3, E e4, E e5) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5); } @@ -930,7 +931,7 @@ static List of(E e1, E e2, E e3, E e4, E e5) { * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5, E e6) { + static List of(E e1, E e2, E e3, E e4, E e5, E e6) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6); } @@ -953,7 +954,7 @@ static List of(E e1, E e2, E e3, E e4, E e5, E e6) { * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { + static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6, e7); } @@ -977,7 +978,7 @@ static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) { + static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6, e7, e8); } @@ -1002,7 +1003,7 @@ static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) { + static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6, e7, e8, e9); } @@ -1028,7 +1029,7 @@ static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E * * @since 9 */ - static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { + static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); } @@ -1060,7 +1061,7 @@ static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E */ @SafeVarargs @SuppressWarnings("varargs") - static List of(E... elements) { + static List of(E... elements) { switch (elements.length) { // implicit null check of elements case 0: return ImmutableCollections.emptyList(); @@ -1089,7 +1090,7 @@ static List of(E... elements) { * @throws NullPointerException if coll is null, or if it contains any nulls * @since 10 */ - static List copyOf(Collection coll) { + static List copyOf(Collection coll) { return ImmutableCollections.listCopy(coll); } } diff --git a/src/java.base/share/classes/java/util/Map.java b/src/java.base/share/classes/java/util/Map.java index 9e811a4cfa6..982d61a8d2a 100644 --- a/src/java.base/share/classes/java/util/Map.java +++ b/src/java.base/share/classes/java/util/Map.java @@ -1345,7 +1345,7 @@ static Map of() { * * @since 9 */ - static Map of(K k1, V v1) { + static Map of(K k1, V v1) { return new ImmutableCollections.Map1<>(k1, v1); } @@ -1365,7 +1365,7 @@ static Map of(K k1, V v1) { * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2) { + static Map of(K k1, V v1, K k2, V v2) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2); } @@ -1387,7 +1387,7 @@ static Map of(K k1, V v1, K k2, V v2) * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3); } @@ -1411,7 +1411,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4); } @@ -1437,7 +1437,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5); } @@ -1465,7 +1465,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6); @@ -1497,7 +1497,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7); @@ -1531,7 +1531,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8); @@ -1567,7 +1567,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9); @@ -1605,7 +1605,7 @@ static Map of(K k1, V v1, K k2, V v2, * * @since 9 */ - static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, + static Map of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) { return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5, k6, v6, k7, v7, k8, v8, k9, v9, k10, v10); @@ -1644,7 +1644,7 @@ static Map of(K k1, V v1, K k2, V v2, */ @SafeVarargs @SuppressWarnings("varargs") - static Map ofEntries(Entry... entries) { + static Map ofEntries(Entry... entries) { if (entries.length == 0) { // implicit null check of entries array return ImmutableCollections.emptyMap(); } else if (entries.length == 1) { @@ -1696,7 +1696,7 @@ static Map ofEntries(Entry Entry entry(K k, V v) { + static Entry entry(K k, V v) { // KeyValueHolder checks for nulls return new KeyValueHolder<>(k, v); } @@ -1719,7 +1719,7 @@ static Entry entry(K k, V v) { * @since 10 */ @SuppressWarnings({"rawtypes","unchecked"}) - static Map copyOf(Map map) { + static Map copyOf(Map map) { if (map instanceof ImmutableCollections.AbstractImmutableMap) { return (Map)map; } else { diff --git a/src/java.base/share/classes/java/util/Set.java b/src/java.base/share/classes/java/util/Set.java index 0f5ae16ab48..017d853d053 100644 --- a/src/java.base/share/classes/java/util/Set.java +++ b/src/java.base/share/classes/java/util/Set.java @@ -27,6 +27,7 @@ import org.checkerframework.checker.index.qual.NonNegative; import org.checkerframework.checker.lock.qual.GuardSatisfied; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.PolyNull; import org.checkerframework.dataflow.qual.Pure; @@ -483,7 +484,7 @@ static Set of() { * * @since 9 */ - static Set of(E e1) { + static Set of(E e1) { return new ImmutableCollections.Set12<>(e1); } @@ -500,7 +501,7 @@ static Set of(E e1) { * * @since 9 */ - static Set of(E e1, E e2) { + static Set of(E e1, E e2) { return new ImmutableCollections.Set12<>(e1, e2); } @@ -518,7 +519,7 @@ static Set of(E e1, E e2) { * * @since 9 */ - static Set of(E e1, E e2, E e3) { + static Set of(E e1, E e2, E e3) { return new ImmutableCollections.SetN<>(e1, e2, e3); } @@ -537,7 +538,7 @@ static Set of(E e1, E e2, E e3) { * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4) { + static Set of(E e1, E e2, E e3, E e4) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4); } @@ -557,7 +558,7 @@ static Set of(E e1, E e2, E e3, E e4) { * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5) { + static Set of(E e1, E e2, E e3, E e4, E e5) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5); } @@ -578,7 +579,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5) { * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5, E e6) { + static Set of(E e1, E e2, E e3, E e4, E e5, E e6) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5, e6); } @@ -601,7 +602,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5, E e6) { * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { + static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5, e6, e7); } @@ -625,7 +626,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7) { * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) { + static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5, e6, e7, e8); } @@ -650,7 +651,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) { + static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5, e6, e7, e8, e9); } @@ -676,7 +677,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E * * @since 9 */ - static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { + static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) { return new ImmutableCollections.SetN<>(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); } @@ -709,7 +710,7 @@ static Set of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E */ @SafeVarargs @SuppressWarnings("varargs") - static Set of(E... elements) { + static Set of(E... elements) { switch (elements.length) { // implicit null check of elements case 0: return ImmutableCollections.emptySet(); @@ -740,7 +741,7 @@ static Set of(E... elements) { * @since 10 */ @SuppressWarnings("unchecked") - static Set copyOf(Collection coll) { + static Set copyOf(Collection coll) { if (coll instanceof ImmutableCollections.AbstractImmutableSet) { return (Set)coll; } else { diff --git a/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java index a93e77bd76e..d7b85c28abe 100644 --- a/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/ArrayBlockingQueue.java @@ -90,7 +90,7 @@ * @param the type of elements held in this queue */ @AnnotatedFor({"nullness"}) -public class ArrayBlockingQueue extends AbstractQueue +public class ArrayBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable { /* diff --git a/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java b/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java index 379d5e9c972..5a65128c149 100644 --- a/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java +++ b/src/java.base/share/classes/java/util/concurrent/LinkedBlockingDeque.java @@ -82,7 +82,7 @@ * @param the type of elements held in this deque */ @AnnotatedFor({"nullness"}) -public class LinkedBlockingDeque +public class LinkedBlockingDeque extends AbstractQueue implements BlockingDeque, java.io.Serializable { diff --git a/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java index 445c393301f..506242f0048 100644 --- a/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java @@ -85,7 +85,7 @@ * @param the type of elements held in this queue */ @AnnotatedFor({"nullness"}) -public class LinkedBlockingQueue extends AbstractQueue +public class LinkedBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable { private static final long serialVersionUID = -6903933977591709194L; diff --git a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java index 6e6c2e677d6..fd5b52e65f2 100644 --- a/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java +++ b/src/java.base/share/classes/java/util/concurrent/PriorityBlockingQueue.java @@ -118,7 +118,7 @@ */ @AnnotatedFor({"nullness"}) @SuppressWarnings("unchecked") -public class PriorityBlockingQueue extends AbstractQueue +public class PriorityBlockingQueue extends AbstractQueue implements BlockingQueue, java.io.Serializable { private static final long serialVersionUID = 5595510919245408276L; diff --git a/src/java.base/share/classes/java/util/stream/Collectors.java b/src/java.base/share/classes/java/util/stream/Collectors.java index 9520957b440..2d6efd38cc1 100644 --- a/src/java.base/share/classes/java/util/stream/Collectors.java +++ b/src/java.base/share/classes/java/util/stream/Collectors.java @@ -24,6 +24,7 @@ */ package java.util.stream; +import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.SideEffectFree; @@ -1187,7 +1188,7 @@ public void accept(T t) { * @see #groupingByConcurrent(Function, Collector) * @see #groupingByConcurrent(Function, Supplier, Collector) */ - public static + public static Collector>> groupingByConcurrent(Function classifier) { return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList()); @@ -1233,7 +1234,7 @@ public void accept(T t) { * @see #groupingByConcurrent(Function) * @see #groupingByConcurrent(Function, Supplier, Collector) */ - public static + public static Collector> groupingByConcurrent(Function classifier, Collector downstream) { return groupingByConcurrent(classifier, ConcurrentHashMap::new, downstream); @@ -1281,7 +1282,7 @@ public void accept(T t) { * @see #groupingByConcurrent(Function, Collector) * @see #groupingBy(Function, Supplier, Collector) */ - public static > + public static > Collector groupingByConcurrent(Function classifier, Supplier mapFactory, Collector downstream) { @@ -1459,7 +1460,7 @@ public void accept(T t) { * @see #toMap(Function, Function, BinaryOperator, Supplier) * @see #toConcurrentMap(Function, Function) */ - public static + public static Collector> toMap(Function keyMapper, Function valueMapper) { return new CollectorImpl<>(HashMap::new, @@ -1497,7 +1498,7 @@ public void accept(T t) { * @since 10 */ @SuppressWarnings({"rawtypes", "unchecked"}) - public static + public static Collector> toUnmodifiableMap(Function keyMapper, Function valueMapper) { Objects.requireNonNull(keyMapper, "keyMapper"); @@ -1563,7 +1564,7 @@ public void accept(T t) { * @see #toMap(Function, Function, BinaryOperator, Supplier) * @see #toConcurrentMap(Function, Function, BinaryOperator) */ - public static + public static Collector> toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) { @@ -1603,7 +1604,7 @@ public void accept(T t) { * @since 10 */ @SuppressWarnings({"rawtypes", "unchecked"}) - public static + public static Collector> toUnmodifiableMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) { @@ -1655,7 +1656,7 @@ public void accept(T t) { * @see #toMap(Function, Function, BinaryOperator) * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier) */ - public static > + public static > Collector toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, @@ -1718,7 +1719,7 @@ public void accept(T t) { * @see #toConcurrentMap(Function, Function, BinaryOperator) * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier) */ - public static + public static Collector> toConcurrentMap(Function keyMapper, Function valueMapper) { return new CollectorImpl<>(ConcurrentHashMap::new, @@ -1777,7 +1778,7 @@ public void accept(T t) { * @see #toConcurrentMap(Function, Function, BinaryOperator, Supplier) * @see #toMap(Function, Function, BinaryOperator) */ - public static + public static Collector> toConcurrentMap(Function keyMapper, Function valueMapper, @@ -1819,7 +1820,7 @@ public void accept(T t) { * @see #toConcurrentMap(Function, Function, BinaryOperator) * @see #toMap(Function, Function, BinaryOperator, Supplier) */ - public static > + public static > Collector toConcurrentMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction,