diff --git a/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java b/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java index b226b220..7cc724b8 100644 --- a/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java +++ b/extras/src/main/java/com/google/gson/graph/GraphAdapterBuilder.java @@ -31,10 +31,10 @@ import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.lang.reflect.Type; +import java.util.ArrayDeque; import java.util.Collections; import java.util.HashMap; import java.util.IdentityHashMap; -import java.util.LinkedList; import java.util.Map; import java.util.Queue; @@ -79,6 +79,7 @@ public final class GraphAdapterBuilder { static class Factory implements TypeAdapterFactory, InstanceCreator { private final Map> instanceCreators; + @SuppressWarnings("ThreadLocalUsage") private final ThreadLocal graphThreadLocal = new ThreadLocal<>(); Factory(Map> instanceCreators) { @@ -240,7 +241,7 @@ public final class GraphAdapterBuilder { * The queue of elements to write during serialization. Unused during * deserialization. */ - private final Queue> queue = new LinkedList<>(); + private final Queue> queue = new ArrayDeque<>(); /** * The instance currently being deserialized. Used as a backdoor between diff --git a/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java b/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java index 69bed0e8..2d6060ca 100644 --- a/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java +++ b/extras/src/main/java/com/google/gson/interceptors/InterceptorFactory.java @@ -46,7 +46,7 @@ public final class InterceptorFactory implements TypeAdapterFactory { public InterceptorAdapter(TypeAdapter delegate, Intercept intercept) { try { this.delegate = delegate; - this.postDeserializer = intercept.postDeserialize().newInstance(); + this.postDeserializer = intercept.postDeserialize().getDeclaredConstructor().newInstance(); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/gson/pom.xml b/gson/pom.xml index b7ee60b9..1460f70d 100644 --- a/gson/pom.xml +++ b/gson/pom.xml @@ -49,6 +49,12 @@ 1.1.3 test + + com.google.guava + guava-testlib + 31.1-jre + test + diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 34f92fab..054b1f92 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -166,6 +166,7 @@ public final class Gson { * with the type token provided to {@code getAdapter} as key and either * {@code FutureTypeAdapter} or a regular {@code TypeAdapter} as value. */ + @SuppressWarnings("ThreadLocalUsage") private final ThreadLocal, TypeAdapter>> threadLocalAdapterResults = new ThreadLocal<>(); private final ConcurrentMap, TypeAdapter> typeTokenCache = new ConcurrentHashMap<>(); diff --git a/gson/src/main/java/com/google/gson/GsonBuilder.java b/gson/src/main/java/com/google/gson/GsonBuilder.java index 63c7f047..0afc2337 100644 --- a/gson/src/main/java/com/google/gson/GsonBuilder.java +++ b/gson/src/main/java/com/google/gson/GsonBuilder.java @@ -19,11 +19,11 @@ package com.google.gson; import static com.google.gson.Gson.DEFAULT_COMPLEX_MAP_KEYS; import static com.google.gson.Gson.DEFAULT_DATE_PATTERN; import static com.google.gson.Gson.DEFAULT_ESCAPE_HTML; +import static com.google.gson.Gson.DEFAULT_FORMATTING_STYLE; import static com.google.gson.Gson.DEFAULT_JSON_NON_EXECUTABLE; import static com.google.gson.Gson.DEFAULT_LENIENT; import static com.google.gson.Gson.DEFAULT_NUMBER_TO_NUMBER_STRATEGY; import static com.google.gson.Gson.DEFAULT_OBJECT_TO_NUMBER_STRATEGY; -import static com.google.gson.Gson.DEFAULT_FORMATTING_STYLE; import static com.google.gson.Gson.DEFAULT_SERIALIZE_NULLS; import static com.google.gson.Gson.DEFAULT_SPECIALIZE_FLOAT_VALUES; import static com.google.gson.Gson.DEFAULT_USE_JDK_UNSAFE; @@ -41,11 +41,11 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.lang.reflect.Type; import java.text.DateFormat; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -104,7 +104,7 @@ public final class GsonBuilder { private boolean useJdkUnsafe = DEFAULT_USE_JDK_UNSAFE; private ToNumberStrategy objectToNumberStrategy = DEFAULT_OBJECT_TO_NUMBER_STRATEGY; private ToNumberStrategy numberToNumberStrategy = DEFAULT_NUMBER_TO_NUMBER_STRATEGY; - private final LinkedList reflectionFilters = new LinkedList<>(); + private final ArrayDeque reflectionFilters = new ArrayDeque<>(); /** * Creates a GsonBuilder instance that can be used to build Gson with various configuration diff --git a/gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java b/gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java index 115a2a09..a08d9df4 100644 --- a/gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java +++ b/gson/src/main/java/com/google/gson/internal/ConstructorConstructor.java @@ -342,8 +342,8 @@ public final class ConstructorConstructor { return (T) new TreeMap<>(); } }; - } else if (type instanceof ParameterizedType && !(String.class.isAssignableFrom( - TypeToken.get(((ParameterizedType) type).getActualTypeArguments()[0]).getRawType()))) { + } else if (type instanceof ParameterizedType && !String.class.isAssignableFrom( + TypeToken.get(((ParameterizedType) type).getActualTypeArguments()[0]).getRawType())) { return new ObjectConstructor() { @Override public T construct() { return (T) new LinkedHashMap<>(); diff --git a/gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java b/gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java index abc4b2a4..6385bc96 100644 --- a/gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java +++ b/gson/src/main/java/com/google/gson/internal/LazilyParsedNumber.java @@ -98,7 +98,7 @@ public final class LazilyParsedNumber extends Number { } if (obj instanceof LazilyParsedNumber) { LazilyParsedNumber other = (LazilyParsedNumber) obj; - return value == other.value || value.equals(other.value); + return value.equals(other.value); } return false; } diff --git a/gson/src/main/java/com/google/gson/internal/LinkedTreeMap.java b/gson/src/main/java/com/google/gson/internal/LinkedTreeMap.java index 1fe512ad..a78191a4 100644 --- a/gson/src/main/java/com/google/gson/internal/LinkedTreeMap.java +++ b/gson/src/main/java/com/google/gson/internal/LinkedTreeMap.java @@ -304,6 +304,7 @@ public final class LinkedTreeMap extends AbstractMap implements Seri return node; } + @SuppressWarnings("ReferenceEquality") private void replaceInParent(Node node, Node replacement) { Node parent = node.parent; node.parent = null; @@ -315,7 +316,7 @@ public final class LinkedTreeMap extends AbstractMap implements Seri if (parent.left == node) { parent.left = replacement; } else { - assert (parent.right == node); + assert parent.right == node; parent.right = replacement; } } else { @@ -559,10 +560,13 @@ public final class LinkedTreeMap extends AbstractMap implements Seri LinkedTreeMapIterator() { } - @Override public final boolean hasNext() { + @Override + @SuppressWarnings("ReferenceEquality") + public final boolean hasNext() { return next != header; } + @SuppressWarnings("ReferenceEquality") final Node nextNode() { Node e = next; if (e == header) { diff --git a/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java index 23648e56..fca3dafc 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/ArrayTypeAdapter.java @@ -37,7 +37,7 @@ public final class ArrayTypeAdapter extends TypeAdapter { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { @Override public TypeAdapter create(Gson gson, TypeToken typeToken) { Type type = typeToken.getType(); - if (!(type instanceof GenericArrayType || type instanceof Class && ((Class) type).isArray())) { + if (!(type instanceof GenericArrayType || (type instanceof Class && ((Class) type).isArray()))) { return null; } diff --git a/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java index 2efd6c6b..47ca8fc0 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java @@ -158,7 +158,7 @@ public final class TreeTypeAdapter extends SerializationDelegatingTypeAdapter @Override public TypeAdapter create(Gson gson, TypeToken type) { boolean matches = exactType != null - ? exactType.equals(type) || matchRawType && exactType.getType() == type.getRawType() + ? exactType.equals(type) || (matchRawType && exactType.getType() == type.getRawType()) : hierarchyType.isAssignableFrom(type.getRawType()); return matches ? new TreeTypeAdapter<>((JsonSerializer) serializer, diff --git a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java index cb069ae7..b76a0f0e 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TypeAdapters.java @@ -123,7 +123,7 @@ public final class TypeAdapters { @Override public void write(JsonWriter out, BitSet src) throws IOException { out.beginArray(); for (int i = 0, length = src.length(); i < length; i++) { - int value = (src.get(i)) ? 1 : 0; + int value = src.get(i) ? 1 : 0; out.value(value); } out.endArray(); @@ -883,7 +883,7 @@ public final class TypeAdapters { }); for (Field constantField : constantFields) { @SuppressWarnings("unchecked") - T constant = (T)(constantField.get(null)); + T constant = (T) constantField.get(null); String name = constant.name(); String toStringVal = constant.toString(); diff --git a/gson/src/main/java/com/google/gson/stream/JsonWriter.java b/gson/src/main/java/com/google/gson/stream/JsonWriter.java index 5afa228e..460dcce2 100644 --- a/gson/src/main/java/com/google/gson/stream/JsonWriter.java +++ b/gson/src/main/java/com/google/gson/stream/JsonWriter.java @@ -637,7 +637,7 @@ public class JsonWriter implements Closeable, Flushable { out.close(); int size = stackSize; - if (size > 1 || size == 1 && stack[size - 1] != NONEMPTY_DOCUMENT) { + if (size > 1 || (size == 1 && stack[size - 1] != NONEMPTY_DOCUMENT)) { throw new IOException("Incomplete document"); } stackSize = 0; diff --git a/gson/src/test/java/com/google/gson/JsonArrayTest.java b/gson/src/test/java/com/google/gson/JsonArrayTest.java index bb531117..bd0f7a17 100644 --- a/gson/src/test/java/com/google/gson/JsonArrayTest.java +++ b/gson/src/test/java/com/google/gson/JsonArrayTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import static org.junit.Assert.fail; +import com.google.common.testing.EqualsTester; import com.google.gson.common.MoreAsserts; import java.math.BigInteger; import org.junit.Test; @@ -35,12 +36,11 @@ public final class JsonArrayTest { } @Test - @SuppressWarnings("TruthSelfEquals") public void testEqualsNonEmptyArray() { JsonArray a = new JsonArray(); JsonArray b = new JsonArray(); - assertThat(a).isEqualTo(a); + new EqualsTester().addEqualityGroup(a).testEquals(); a.add(new JsonObject()); assertThat(a.equals(b)).isFalse(); diff --git a/gson/src/test/java/com/google/gson/JsonObjectTest.java b/gson/src/test/java/com/google/gson/JsonObjectTest.java index 9b37823d..0b7c4033 100644 --- a/gson/src/test/java/com/google/gson/JsonObjectTest.java +++ b/gson/src/test/java/com/google/gson/JsonObjectTest.java @@ -19,6 +19,7 @@ package com.google.gson; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; +import com.google.common.testing.EqualsTester; import com.google.gson.common.MoreAsserts; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayDeque; @@ -163,12 +164,11 @@ public class JsonObjectTest { } @Test - @SuppressWarnings("TruthSelfEquals") public void testEqualsNonEmptyObject() { JsonObject a = new JsonObject(); JsonObject b = new JsonObject(); - assertThat(a).isEqualTo(a); + new EqualsTester().addEqualityGroup(a).testEquals(); a.add("foo", new JsonObject()); assertThat(a.equals(b)).isFalse(); diff --git a/pom.xml b/pom.xml index babfbc24..6a254d55 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ -XDcompilePolicy=simple - -Xplugin:ErrorProne + -Xplugin:ErrorProne -XepExcludedPaths:.*gson/src/test.*|.*extras/src/test.*|.*proto.* -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED