From d0188bd5b5b67bfd9e9d34516a941a4665a51b55 Mon Sep 17 00:00:00 2001 From: cpovirk Date: Wed, 23 Aug 2023 07:21:27 -0700 Subject: [PATCH] Update code for forthcoming nullness annotations for JDK classes. The Guava changes include further annotations [from "On Leveraging Tests to Infer Nullable Annotations."](https://github.com/google/guava/issues/6510) RELNOTES=n/a PiperOrigin-RevId: 559416747 --- .../com/google/common/cache/LocalCache.java | 8 ++++- .../google/common/collect/AbstractBiMap.java | 3 +- .../collect/ConcurrentHashMultiset.java | 3 +- .../com/google/common/collect/EnumBiMap.java | 5 +-- .../google/common/collect/EnumHashBiMap.java | 3 +- .../google/common/collect/EnumMultiset.java | 3 +- .../common/collect/ImmutableListMultimap.java | 6 ++-- .../common/collect/ImmutableSetMultimap.java | 5 +-- .../com/google/common/collect/Multimaps.java | 16 ++++----- .../google/common/collect/TreeMultiset.java | 2 +- .../com/google/common/cache/LocalCache.java | 23 +++++++++---- .../google/common/collect/AbstractBiMap.java | 3 +- .../collect/ConcurrentHashMultiset.java | 3 +- .../com/google/common/collect/EnumBiMap.java | 5 +-- .../google/common/collect/EnumHashBiMap.java | 3 +- .../google/common/collect/EnumMultiset.java | 3 +- .../common/collect/ImmutableListMultimap.java | 6 ++-- .../google/common/collect/ImmutableMap.java | 6 ++-- .../common/collect/ImmutableSetMultimap.java | 5 +-- guava/src/com/google/common/collect/Maps.java | 34 +++++++++++++++---- .../com/google/common/collect/Multimaps.java | 16 ++++----- .../google/common/collect/Synchronized.java | 17 ++++++++-- .../google/common/collect/TreeMultiset.java | 2 +- 23 files changed, 124 insertions(+), 56 deletions(-) diff --git a/android/guava/src/com/google/common/cache/LocalCache.java b/android/guava/src/com/google/common/cache/LocalCache.java index 239afe20475b..f0a7699e0700 100644 --- a/android/guava/src/com/google/common/cache/LocalCache.java +++ b/android/guava/src/com/google/common/cache/LocalCache.java @@ -277,7 +277,8 @@ class LocalCache extends AbstractMap implements ConcurrentMap // will result in random eviction behavior. int segmentShift = 0; int segmentCount = 1; - while (segmentCount < concurrencyLevel && (!evictsBySize() || segmentCount * 20 <= maxWeight)) { + while (segmentCount < concurrencyLevel + && (!evictsBySize() || segmentCount * 20L <= maxWeight)) { ++segmentShift; segmentCount <<= 1; } @@ -3430,6 +3431,11 @@ public LoadingValueReference() { this(LocalCache.unset()); } + /* + * TODO(cpovirk): Consider making this implementation closer to the mainline implementation. + * (The difference was introduced as part of Java-8-specific changes in cl/132882204, but we + * could probably make *some* of those changes here in the backport, too.) + */ public LoadingValueReference(ValueReference oldValue) { this.oldValue = oldValue; } diff --git a/android/guava/src/com/google/common/collect/AbstractBiMap.java b/android/guava/src/com/google/common/collect/AbstractBiMap.java index 10edc5c4c198..d8566f2fea78 100644 --- a/android/guava/src/com/google/common/collect/AbstractBiMap.java +++ b/android/guava/src/com/google/common/collect/AbstractBiMap.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -478,7 +479,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - setInverse((AbstractBiMap) stream.readObject()); + setInverse((AbstractBiMap) requireNonNull(stream.readObject())); } @GwtIncompatible // Not needed in the emulated source. diff --git a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java index 723ab0696aa9..a84e3cee78d4 100644 --- a/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java +++ b/android/guava/src/com/google/common/collect/ConcurrentHashMultiset.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.CollectPreconditions.checkNonnegative; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtIncompatible; import com.google.common.annotations.J2ktIncompatible; @@ -599,7 +600,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject ConcurrentMap deserializedCountMap = - (ConcurrentMap) stream.readObject(); + (ConcurrentMap) requireNonNull(stream.readObject()); FieldSettersHolder.COUNT_MAP_FIELD_SETTER.set(this, deserializedCountMap); } diff --git a/android/guava/src/com/google/common/collect/EnumBiMap.java b/android/guava/src/com/google/common/collect/EnumBiMap.java index c4b540b56465..b7d297272d60 100644 --- a/android/guava/src/com/google/common/collect/EnumBiMap.java +++ b/android/guava/src/com/google/common/collect/EnumBiMap.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Platform.getDeclaringClassOrObjectForJ2cl; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -151,8 +152,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @GwtIncompatible // java.io.ObjectInputStream private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - keyTypeOrObjectUnderJ2cl = (Class) stream.readObject(); - valueTypeOrObjectUnderJ2cl = (Class) stream.readObject(); + keyTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); + valueTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); setDelegates( new EnumMap(keyTypeOrObjectUnderJ2cl), new EnumMap(valueTypeOrObjectUnderJ2cl)); Serialization.populateMap(this, stream); diff --git a/android/guava/src/com/google/common/collect/EnumHashBiMap.java b/android/guava/src/com/google/common/collect/EnumHashBiMap.java index 33b45b95cf14..c7432d404608 100644 --- a/android/guava/src/com/google/common/collect/EnumHashBiMap.java +++ b/android/guava/src/com/google/common/collect/EnumHashBiMap.java @@ -17,6 +17,7 @@ package com.google.common.collect; import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -128,7 +129,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @GwtIncompatible // java.io.ObjectInputStream private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - keyTypeOrObjectUnderJ2cl = (Class) stream.readObject(); + keyTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); /* * TODO: cpovirk - Pre-size the HashMap based on the number of enum values? (But *not* based on * the number of entries in the map, as that makes it easy for hostile inputs to trigger lots of diff --git a/android/guava/src/com/google/common/collect/EnumMultiset.java b/android/guava/src/com/google/common/collect/EnumMultiset.java index 493bcc73a8c9..ee5fc9e2ed05 100644 --- a/android/guava/src/com/google/common/collect/EnumMultiset.java +++ b/android/guava/src/com/google/common/collect/EnumMultiset.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.CollectPreconditions.checkNonnegative; import static com.google.common.collect.CollectPreconditions.checkRemove; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -298,7 +299,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject - Class localType = (Class) stream.readObject(); + Class localType = (Class) requireNonNull(stream.readObject()); type = localType; enumConstants = type.getEnumConstants(); counts = new int[enumConstants.length]; diff --git a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java index fbc8ce2f5d74..7c04f450054e 100644 --- a/android/guava/src/com/google/common/collect/ImmutableListMultimap.java +++ b/android/guava/src/com/google/common/collect/ImmutableListMultimap.java @@ -16,6 +16,8 @@ package com.google.common.collect; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; import com.google.common.annotations.J2ktIncompatible; @@ -397,7 +399,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo int tmpSize = 0; for (int i = 0; i < keyCount; i++) { - Object key = stream.readObject(); + Object key = requireNonNull(stream.readObject()); int valueCount = stream.readInt(); if (valueCount <= 0) { throw new InvalidObjectException("Invalid value count " + valueCount); @@ -405,7 +407,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo ImmutableList.Builder valuesBuilder = ImmutableList.builder(); for (int j = 0; j < valueCount; j++) { - valuesBuilder.add(stream.readObject()); + valuesBuilder.add(requireNonNull(stream.readObject())); } builder.put(key, valuesBuilder.build()); tmpSize += valueCount; diff --git a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java index 354a7c55f6f2..b0039636a1b7 100644 --- a/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java +++ b/android/guava/src/com/google/common/collect/ImmutableSetMultimap.java @@ -17,6 +17,7 @@ package com.google.common.collect; import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -530,7 +531,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo int tmpSize = 0; for (int i = 0; i < keyCount; i++) { - Object key = stream.readObject(); + Object key = requireNonNull(stream.readObject()); int valueCount = stream.readInt(); if (valueCount <= 0) { throw new InvalidObjectException("Invalid value count " + valueCount); @@ -538,7 +539,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo ImmutableSet.Builder valuesBuilder = valuesBuilder(valueComparator); for (int j = 0; j < valueCount; j++) { - valuesBuilder.add(stream.readObject()); + valuesBuilder.add(requireNonNull(stream.readObject())); } ImmutableSet valueSet = valuesBuilder.build(); if (valueSet.size() != valueCount) { diff --git a/android/guava/src/com/google/common/collect/Multimaps.java b/android/guava/src/com/google/common/collect/Multimaps.java index ea4148801176..a1ca78d5ba03 100644 --- a/android/guava/src/com/google/common/collect/Multimaps.java +++ b/android/guava/src/com/google/common/collect/Multimaps.java @@ -187,8 +187,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -273,8 +273,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -381,8 +381,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -475,9 +475,9 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); valueComparator = factory.get().comparator(); - Map> map = (Map>) stream.readObject(); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } diff --git a/android/guava/src/com/google/common/collect/TreeMultiset.java b/android/guava/src/com/google/common/collect/TreeMultiset.java index f3367ef9a757..c25385f1df5a 100644 --- a/android/guava/src/com/google/common/collect/TreeMultiset.java +++ b/android/guava/src/com/google/common/collect/TreeMultiset.java @@ -1076,7 +1076,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject - Comparator comparator = (Comparator) stream.readObject(); + Comparator comparator = (Comparator) requireNonNull(stream.readObject()); Serialization.getFieldSetter(AbstractSortedMultiset.class, "comparator").set(this, comparator); Serialization.getFieldSetter(TreeMultiset.class, "range") .set(this, GeneralRange.all(comparator)); diff --git a/guava/src/com/google/common/cache/LocalCache.java b/guava/src/com/google/common/cache/LocalCache.java index 00fb435757b6..a38543dbb7b6 100644 --- a/guava/src/com/google/common/cache/LocalCache.java +++ b/guava/src/com/google/common/cache/LocalCache.java @@ -281,7 +281,8 @@ class LocalCache extends AbstractMap implements ConcurrentMap // will result in random eviction behavior. int segmentShift = 0; int segmentCount = 1; - while (segmentCount < concurrencyLevel && (!evictsBySize() || segmentCount * 20 <= maxWeight)) { + while (segmentCount < concurrencyLevel + && (!evictsBySize() || segmentCount * 20L <= maxWeight)) { ++segmentShift; segmentCount <<= 1; } @@ -2220,7 +2221,11 @@ V waitForLoadingValue(ReferenceEntry e, K key, ValueReference valueR } } - V compute(K key, int hash, BiFunction function) { + @CheckForNull + V compute( + K key, + int hash, + BiFunction function) { ReferenceEntry e; ValueReference valueReference = null; ComputingValueReference computingValueReference = null; @@ -3516,7 +3521,7 @@ public LoadingValueReference() { this(null); } - public LoadingValueReference(ValueReference oldValue) { + public LoadingValueReference(@CheckForNull ValueReference oldValue) { this.oldValue = (oldValue == null) ? LocalCache.unset() : oldValue; } @@ -3593,7 +3598,9 @@ public ListenableFuture loadFuture(K key, CacheLoader loader) { } } - public V compute(K key, BiFunction function) { + @CheckForNull + public V compute( + K key, BiFunction function) { stopwatch.start(); V previousValue; try { @@ -4255,7 +4262,9 @@ public V putIfAbsent(K key, V value) { } @Override - public V compute(K key, BiFunction function) { + @CheckForNull + public V compute( + K key, BiFunction function) { checkNotNull(key); checkNotNull(function); int hash = hash(key); @@ -4270,7 +4279,9 @@ public V computeIfAbsent(K key, Function function) { } @Override - public V computeIfPresent(K key, BiFunction function) { + @CheckForNull + public V computeIfPresent( + K key, BiFunction function) { checkNotNull(key); checkNotNull(function); return compute(key, (k, oldValue) -> (oldValue == null) ? null : function.apply(k, oldValue)); diff --git a/guava/src/com/google/common/collect/AbstractBiMap.java b/guava/src/com/google/common/collect/AbstractBiMap.java index 0563ea0e8d41..fab709a54114 100644 --- a/guava/src/com/google/common/collect/AbstractBiMap.java +++ b/guava/src/com/google/common/collect/AbstractBiMap.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.NullnessCasts.uncheckedCastNullableTToT; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -502,7 +503,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - setInverse((AbstractBiMap) stream.readObject()); + setInverse((AbstractBiMap) requireNonNull(stream.readObject())); } @GwtIncompatible // Not needed in the emulated source. diff --git a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java index 723ab0696aa9..a84e3cee78d4 100644 --- a/guava/src/com/google/common/collect/ConcurrentHashMultiset.java +++ b/guava/src/com/google/common/collect/ConcurrentHashMultiset.java @@ -20,6 +20,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.CollectPreconditions.checkNonnegative; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtIncompatible; import com.google.common.annotations.J2ktIncompatible; @@ -599,7 +600,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject ConcurrentMap deserializedCountMap = - (ConcurrentMap) stream.readObject(); + (ConcurrentMap) requireNonNull(stream.readObject()); FieldSettersHolder.COUNT_MAP_FIELD_SETTER.set(this, deserializedCountMap); } diff --git a/guava/src/com/google/common/collect/EnumBiMap.java b/guava/src/com/google/common/collect/EnumBiMap.java index c4b540b56465..b7d297272d60 100644 --- a/guava/src/com/google/common/collect/EnumBiMap.java +++ b/guava/src/com/google/common/collect/EnumBiMap.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Platform.getDeclaringClassOrObjectForJ2cl; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -151,8 +152,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @GwtIncompatible // java.io.ObjectInputStream private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - keyTypeOrObjectUnderJ2cl = (Class) stream.readObject(); - valueTypeOrObjectUnderJ2cl = (Class) stream.readObject(); + keyTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); + valueTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); setDelegates( new EnumMap(keyTypeOrObjectUnderJ2cl), new EnumMap(valueTypeOrObjectUnderJ2cl)); Serialization.populateMap(this, stream); diff --git a/guava/src/com/google/common/collect/EnumHashBiMap.java b/guava/src/com/google/common/collect/EnumHashBiMap.java index 33b45b95cf14..c7432d404608 100644 --- a/guava/src/com/google/common/collect/EnumHashBiMap.java +++ b/guava/src/com/google/common/collect/EnumHashBiMap.java @@ -17,6 +17,7 @@ package com.google.common.collect; import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -128,7 +129,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @GwtIncompatible // java.io.ObjectInputStream private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - keyTypeOrObjectUnderJ2cl = (Class) stream.readObject(); + keyTypeOrObjectUnderJ2cl = (Class) requireNonNull(stream.readObject()); /* * TODO: cpovirk - Pre-size the HashMap based on the number of enum values? (But *not* based on * the number of entries in the map, as that makes it easy for hostile inputs to trigger lots of diff --git a/guava/src/com/google/common/collect/EnumMultiset.java b/guava/src/com/google/common/collect/EnumMultiset.java index d6ced718bbca..04126f8aae15 100644 --- a/guava/src/com/google/common/collect/EnumMultiset.java +++ b/guava/src/com/google/common/collect/EnumMultiset.java @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.CollectPreconditions.checkNonnegative; import static com.google.common.collect.CollectPreconditions.checkRemove; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -309,7 +310,7 @@ private void writeObject(ObjectOutputStream stream) throws IOException { private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject - Class localType = (Class) stream.readObject(); + Class localType = (Class) requireNonNull(stream.readObject()); type = localType; enumConstants = type.getEnumConstants(); counts = new int[enumConstants.length]; diff --git a/guava/src/com/google/common/collect/ImmutableListMultimap.java b/guava/src/com/google/common/collect/ImmutableListMultimap.java index b46e7ae409ad..e709274842bf 100644 --- a/guava/src/com/google/common/collect/ImmutableListMultimap.java +++ b/guava/src/com/google/common/collect/ImmutableListMultimap.java @@ -16,6 +16,8 @@ package com.google.common.collect; +import static java.util.Objects.requireNonNull; + import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; import com.google.common.annotations.J2ktIncompatible; @@ -473,7 +475,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo int tmpSize = 0; for (int i = 0; i < keyCount; i++) { - Object key = stream.readObject(); + Object key = requireNonNull(stream.readObject()); int valueCount = stream.readInt(); if (valueCount <= 0) { throw new InvalidObjectException("Invalid value count " + valueCount); @@ -481,7 +483,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo ImmutableList.Builder valuesBuilder = ImmutableList.builder(); for (int j = 0; j < valueCount; j++) { - valuesBuilder.add(stream.readObject()); + valuesBuilder.add(requireNonNull(stream.readObject())); } builder.put(key, valuesBuilder.build()); tmpSize += valueCount; diff --git a/guava/src/com/google/common/collect/ImmutableMap.java b/guava/src/com/google/common/collect/ImmutableMap.java index c370e52487e3..2e23df56a40e 100644 --- a/guava/src/com/google/common/collect/ImmutableMap.java +++ b/guava/src/com/google/common/collect/ImmutableMap.java @@ -845,8 +845,9 @@ public final V computeIfAbsent(K key, Function mappingFu @Deprecated @Override @DoNotCall("Always throws UnsupportedOperationException") + @CheckForNull public final V computeIfPresent( - K key, BiFunction remappingFunction) { + K key, BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @@ -859,8 +860,9 @@ public final V computeIfPresent( @Deprecated @Override @DoNotCall("Always throws UnsupportedOperationException") + @CheckForNull public final V compute( - K key, BiFunction remappingFunction) { + K key, BiFunction remappingFunction) { throw new UnsupportedOperationException(); } diff --git a/guava/src/com/google/common/collect/ImmutableSetMultimap.java b/guava/src/com/google/common/collect/ImmutableSetMultimap.java index 4887ae79b194..603580a50610 100644 --- a/guava/src/com/google/common/collect/ImmutableSetMultimap.java +++ b/guava/src/com/google/common/collect/ImmutableSetMultimap.java @@ -17,6 +17,7 @@ package com.google.common.collect; import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import com.google.common.annotations.GwtCompatible; import com.google.common.annotations.GwtIncompatible; @@ -615,7 +616,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo int tmpSize = 0; for (int i = 0; i < keyCount; i++) { - Object key = stream.readObject(); + Object key = requireNonNull(stream.readObject()); int valueCount = stream.readInt(); if (valueCount <= 0) { throw new InvalidObjectException("Invalid value count " + valueCount); @@ -623,7 +624,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo ImmutableSet.Builder valuesBuilder = valuesBuilder(valueComparator); for (int j = 0; j < valueCount; j++) { - valuesBuilder.add(stream.readObject()); + valuesBuilder.add(requireNonNull(stream.readObject())); } ImmutableSet valueSet = valuesBuilder.build(); if (valueSet.size() != valueCount) { diff --git a/guava/src/com/google/common/collect/Maps.java b/guava/src/com/google/common/collect/Maps.java index 173447caff38..9bc33913ed87 100644 --- a/guava/src/com/google/common/collect/Maps.java +++ b/guava/src/com/google/common/collect/Maps.java @@ -1737,22 +1737,33 @@ public V computeIfAbsent( throw new UnsupportedOperationException(); } + /* + * TODO(cpovirk): Uncomment the @NonNull annotations below once our JDK stubs and J2KT + * emulations include them. + */ @Override + @CheckForNull public V computeIfPresent( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @Override + @CheckForNull public V compute( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @Override @CheckForNull public V merge( - K key, V value, BiFunction function) { + K key, + /*@NonNull*/ V value, + BiFunction + function) { throw new UnsupportedOperationException(); } @@ -3644,22 +3655,33 @@ public V computeIfAbsent( throw new UnsupportedOperationException(); } + /* + * TODO(cpovirk): Uncomment the @NonNull annotations below once our JDK stubs and J2KT + * emulations include them. + */ @Override + @CheckForNull public V computeIfPresent( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @Override + @CheckForNull public V compute( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { throw new UnsupportedOperationException(); } @Override @CheckForNull public V merge( - K key, V value, BiFunction function) { + K key, + /*@NonNull*/ V value, + BiFunction + function) { throw new UnsupportedOperationException(); } diff --git a/guava/src/com/google/common/collect/Multimaps.java b/guava/src/com/google/common/collect/Multimaps.java index c614764c5a7a..90401fb25281 100644 --- a/guava/src/com/google/common/collect/Multimaps.java +++ b/guava/src/com/google/common/collect/Multimaps.java @@ -285,8 +285,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -371,8 +371,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -479,8 +479,8 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); - Map> map = (Map>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } @@ -573,9 +573,9 @@ private void writeObject(ObjectOutputStream stream) throws IOException { @SuppressWarnings("unchecked") // reading data stored by writeObject private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { stream.defaultReadObject(); - factory = (Supplier>) stream.readObject(); + factory = (Supplier>) requireNonNull(stream.readObject()); valueComparator = factory.get().comparator(); - Map> map = (Map>) stream.readObject(); + Map> map = (Map>) requireNonNull(stream.readObject()); setMap(map); } diff --git a/guava/src/com/google/common/collect/Synchronized.java b/guava/src/com/google/common/collect/Synchronized.java index b1422e31673f..46c822940128 100644 --- a/guava/src/com/google/common/collect/Synchronized.java +++ b/guava/src/com/google/common/collect/Synchronized.java @@ -1188,17 +1188,25 @@ public V computeIfAbsent(K key, Function mappingFunction } } + /* + * TODO(cpovirk): Uncomment the @NonNull annotations below once our JDK stubs and J2KT + * emulations include them. + */ @Override + @CheckForNull public V computeIfPresent( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { synchronized (mutex) { return delegate().computeIfPresent(key, remappingFunction); } } @Override + @CheckForNull public V compute( - K key, BiFunction remappingFunction) { + K key, + BiFunction remappingFunction) { synchronized (mutex) { return delegate().compute(key, remappingFunction); } @@ -1207,7 +1215,10 @@ public V compute( @Override @CheckForNull public V merge( - K key, V value, BiFunction remappingFunction) { + K key, + /*@NonNull*/ V value, + BiFunction + remappingFunction) { synchronized (mutex) { return delegate().merge(key, value, remappingFunction); } diff --git a/guava/src/com/google/common/collect/TreeMultiset.java b/guava/src/com/google/common/collect/TreeMultiset.java index 7efafd8ec6c0..8024f5ebbb64 100644 --- a/guava/src/com/google/common/collect/TreeMultiset.java +++ b/guava/src/com/google/common/collect/TreeMultiset.java @@ -1088,7 +1088,7 @@ private void readObject(ObjectInputStream stream) throws IOException, ClassNotFo stream.defaultReadObject(); @SuppressWarnings("unchecked") // reading data stored by writeObject - Comparator comparator = (Comparator) stream.readObject(); + Comparator comparator = (Comparator) requireNonNull(stream.readObject()); Serialization.getFieldSetter(AbstractSortedMultiset.class, "comparator").set(this, comparator); Serialization.getFieldSetter(TreeMultiset.class, "range") .set(this, GeneralRange.all(comparator));