aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar cpeyser <cpeyser@google.com>2018-02-02 09:46:10 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-02 09:48:08 -0800
commite68c28939f76182d0a365a6db2673ab90877ddf8 (patch)
tree0a768e7926e6a760963dd7d05b2ebc90aeaae39e /src/main/java/com/google/devtools
parent4656b8486e036712c6d703e8b3e9a6ac08080862 (diff)
AutoCodec can support NestedSet<T>, where T is a declared declared type that
has a CODEC member. AutoCodec cannot yet support other type parameters for NestedSet, like NestedSet<List<Foo>>. This will have to wait for AutoCodec Runtime. PiperOrigin-RevId: 184294808
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java44
2 files changed, 46 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD
index 3404be03a8..b6944d42a2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD
@@ -52,6 +52,8 @@ java_library(
deps = [
":autocodec-annotation",
":unsafe-provider",
+ "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+ "//src/main/java/com/google/devtools/build/lib/collect/nestedset:serialization",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
"//third_party:auto_service",
"//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
index fbe0a19251..1d9ab157d4 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/Marshallers.java
@@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Maps;
import com.google.common.hash.HashCode;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetCodec;
import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.SerializationCodeGenerator.Context;
@@ -690,6 +691,48 @@ class Marshallers {
}
};
+ private final Marshaller nestedSetMarshaller =
+ new Marshaller() {
+ @Override
+ public boolean matches(DeclaredType type) {
+ // env.getElementUtils().getTypeElement mysteriously does not recognize NestedSet, so we
+ // do String comparison.
+ return env.getTypeUtils()
+ .erasure(type)
+ .toString()
+ .equals("com.google.devtools.build.lib.collect.nestedset.NestedSet");
+ }
+
+ @Override
+ public void addSerializationCode(Context context) {
+ TypeMirror typeParameter = context.getDeclaredType().getTypeArguments().get(0);
+ String nestedSetCodec = context.makeName("nestedSetCodec");
+ context.builder.addStatement(
+ "$T<$T> $L = new $T<>($T.CODEC)",
+ NestedSetCodec.class,
+ typeParameter,
+ nestedSetCodec,
+ NestedSetCodec.class,
+ typeParameter);
+ context.builder.addStatement("$L.serialize($L, codedOut)", nestedSetCodec, context.name);
+ }
+
+ @Override
+ public void addDeserializationCode(Context context) {
+ TypeMirror typeParameter = context.getDeclaredType().getTypeArguments().get(0);
+ String nestedSetCodec = context.makeName("nestedSetCodec");
+ context.builder.addStatement(
+ "$T<$T> $L = new $T<>($T.CODEC)",
+ NestedSetCodec.class,
+ typeParameter,
+ nestedSetCodec,
+ NestedSetCodec.class,
+ typeParameter);
+ context.builder.addStatement(
+ "$L = $L.deserialize(codedIn)", context.name, nestedSetCodec);
+ }
+ };
+
private final Marshaller codecMarshaller =
new Marshaller() {
@Override
@@ -752,6 +795,7 @@ class Marshallers {
immutableMapMarshaller,
immutableSortedMapMarshaller,
multimapMarshaller,
+ nestedSetMarshaller,
patternMarshaller,
hashCodeMarshaller,
protoMarshaller,