aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralvinlao <alvinlao@google.com>2020-04-01 17:13:10 -0700
committerChris Povirk <beigetangerine@gmail.com>2020-04-10 11:30:09 -0400
commitaa7582dd33bf325b698744d0670a40c727a15cce (patch)
treef735aed0624fc24829003fb38e642d5bf880b504
parentf91d2fef64ffb10c0bf394c56e72b9c55754cf6d (diff)
downloadauto-aa7582dd33bf325b698744d0670a40c727a15cce.tar.gz
Fix the SerializableAutoValueExtension from crashing if an AutoValue contains multiple properties with the same type.
RELNOTES=n/a ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=304293379
-rw-r--r--value/src/main/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtension.java23
-rw-r--r--value/src/test/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtensionTest.java31
2 files changed, 46 insertions, 8 deletions
diff --git a/value/src/main/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtension.java b/value/src/main/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtension.java
index e8cfc270..89118712 100644
--- a/value/src/main/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtension.java
+++ b/value/src/main/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtension.java
@@ -28,6 +28,7 @@ import com.google.auto.value.extension.AutoValueExtension.Context;
import com.google.auto.value.extension.serializable.serializer.SerializerFactoryLoader;
import com.google.auto.value.extension.serializable.serializer.interfaces.Serializer;
import com.google.auto.value.extension.serializable.serializer.interfaces.SerializerFactory;
+import com.google.common.base.Equivalence;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.squareup.javapoet.AnnotationSpec;
@@ -43,6 +44,7 @@ import com.squareup.javapoet.TypeVariableName;
import java.io.Serializable;
import java.util.List;
import java.util.Optional;
+import java.util.function.Function;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.TypeElement;
@@ -172,14 +174,16 @@ public final class SerializableAutoValueExtension extends AutoValueExtension {
.build();
}
- private ImmutableMap<TypeMirror, Serializer> buildSerializersMap() {
+ private ImmutableMap<Equivalence.Wrapper<TypeMirror>, Serializer> buildSerializersMap() {
SerializerFactory factory =
SerializerFactoryLoader.getFactory(context.processingEnvironment());
return propertyMirrors.stream()
+ .map(PropertyMirror::getType)
+ .map(MoreTypes.equivalence()::wrap)
+ .distinct()
.collect(
toImmutableMap(
- PropertyMirror::getType,
- propertyMirror -> factory.getSerializer(propertyMirror.getType())));
+ Function.identity(), equivalence -> factory.getSerializer(equivalence.get())));
}
/** Adds type parameters to the given {@link ClassName}, if available. */
@@ -198,13 +202,13 @@ public final class SerializableAutoValueExtension extends AutoValueExtension {
private final TypeName outerClassTypeName;
private final ImmutableList<TypeVariableName> typeVariableNames;
private final ImmutableList<PropertyMirror> propertyMirrors;
- private final ImmutableMap<TypeMirror, Serializer> serializersMap;
+ private final ImmutableMap<Equivalence.Wrapper<TypeMirror>, Serializer> serializersMap;
ProxyGenerator(
TypeName outerClassTypeName,
ImmutableList<TypeVariableName> typeVariableNames,
ImmutableList<PropertyMirror> propertyMirrors,
- ImmutableMap<TypeMirror, Serializer> serializersMap) {
+ ImmutableMap<Equivalence.Wrapper<TypeMirror>, Serializer> serializersMap) {
this.outerClassTypeName = outerClassTypeName;
this.typeVariableNames = typeVariableNames;
this.propertyMirrors = propertyMirrors;
@@ -239,7 +243,9 @@ public final class SerializableAutoValueExtension extends AutoValueExtension {
propertyMirror ->
FieldSpec.builder(
TypeName.get(
- serializersMap.get(propertyMirror.getType()).proxyFieldType()),
+ serializersMap
+ .get(MoreTypes.equivalence().wrap(propertyMirror.getType()))
+ .proxyFieldType()),
propertyMirror.getName(),
Modifier.PRIVATE)
.build())
@@ -251,7 +257,8 @@ public final class SerializableAutoValueExtension extends AutoValueExtension {
MethodSpec.Builder constructor = MethodSpec.constructorBuilder();
for (PropertyMirror propertyMirror : propertyMirrors) {
- Serializer serializer = serializersMap.get(propertyMirror.getType());
+ Serializer serializer =
+ serializersMap.get(MoreTypes.equivalence().wrap(propertyMirror.getType()));
String name = propertyMirror.getName();
constructor.addParameter(TypeName.get(propertyMirror.getType()), name);
@@ -281,7 +288,7 @@ public final class SerializableAutoValueExtension extends AutoValueExtension {
/** Maps a serializable type back to its original AutoValue property. */
private CodeBlock resolve(PropertyMirror propertyMirror) {
return serializersMap
- .get(propertyMirror.getType())
+ .get(MoreTypes.equivalence().wrap(propertyMirror.getType()))
.fromProxy(CodeBlock.of(propertyMirror.getName()));
}
}
diff --git a/value/src/test/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtensionTest.java b/value/src/test/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtensionTest.java
index 9974d512..1879d1e5 100644
--- a/value/src/test/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtensionTest.java
+++ b/value/src/test/java/com/google/auto/value/extension/serializable/processor/SerializableAutoValueExtensionTest.java
@@ -384,4 +384,35 @@ public final class SerializableAutoValueExtensionTest {
assertThat(actualAutoValue).isEqualTo(autoValue);
}
+
+ @SerializableAutoValue
+ @AutoValue
+ abstract static class MultiplePropertiesSameType implements Serializable {
+ abstract String a();
+
+ abstract String b();
+
+ static MultiplePropertiesSameType.Builder builder() {
+ return new AutoValue_SerializableAutoValueExtensionTest_MultiplePropertiesSameType.Builder();
+ }
+
+ @AutoValue.Builder
+ abstract static class Builder {
+ abstract MultiplePropertiesSameType.Builder setA(String value);
+
+ abstract MultiplePropertiesSameType.Builder setB(String value);
+
+ abstract MultiplePropertiesSameType build();
+ }
+ }
+
+ @Test
+ public void multiplePropertiesSameType_allFieldsSerialized() {
+ MultiplePropertiesSameType autoValue =
+ MultiplePropertiesSameType.builder().setA("A").setB("B").build();
+
+ MultiplePropertiesSameType actualAutoValue = SerializableTester.reserialize(autoValue);
+
+ assertThat(actualAutoValue).isEqualTo(autoValue);
+ }
}