aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar shahan <shahan@google.com>2018-02-01 16:13:08 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-02-01 16:15:57 -0800
commitb534e6be304f06a40c10ba7834625c5222bb9154 (patch)
tree35f719be7fbbd59c45fe40d4f35530615256217f /src/main/java/com/google/devtools
parent3b760aff0f617607af1b2c0672ad89bc37e96421 (diff)
@AutoCodec @AutoValue support
PiperOrigin-RevId: 184211212
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java50
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/BUILD1
2 files changed, 36 insertions, 15 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
index 52f060f8cb..d648aeb72e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec/AutoCodecProcessor.java
@@ -17,6 +17,7 @@ package com.google.devtools.build.lib.skyframe.serialization.autocodec;
import static com.google.common.collect.ImmutableList.toImmutableList;
import com.google.auto.service.AutoService;
+import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
@@ -165,9 +166,13 @@ public class AutoCodecProcessor extends AbstractProcessor {
TypeSpec.Builder codecClassBuilder =
AutoCodecUtil.initializeCodecClassBuilder(encodedType, parameters.dependency);
- initializeUnsafeOffsets(codecClassBuilder, encodedType, parameters.fields);
-
- codecClassBuilder.addMethod(buildSerializeMethodWithInstantiator(encodedType, parameters));
+ if (encodedType.getAnnotation(AutoValue.class) == null) {
+ initializeUnsafeOffsets(codecClassBuilder, encodedType, parameters.fields);
+ codecClassBuilder.addMethod(buildSerializeMethodWithInstantiator(encodedType, parameters));
+ } else {
+ codecClassBuilder.addMethod(
+ buildSerializeMethodWithInstantiatorForAutoValue(encodedType, parameters));
+ }
MethodSpec.Builder deserializeBuilder =
AutoCodecUtil.initializeDeserializeMethodBuilder(encodedType, parameters.dependency);
@@ -275,8 +280,10 @@ public class AutoCodecProcessor extends AbstractProcessor {
parameter.getSimpleName());
break;
case ARRAY:
+ // fall through
+ case DECLARED:
serializeBuilder.addStatement(
- "$T unsafe_$L = ($T)$T.getInstance().getObject(input, $L_offset)",
+ "$T unsafe_$L = ($T) $T.getInstance().getObject(input, $L_offset)",
field.asType(),
parameter.getSimpleName(),
field.asType(),
@@ -286,19 +293,32 @@ public class AutoCodecProcessor extends AbstractProcessor {
new Marshaller.Context(
serializeBuilder, parameter.asType(), "unsafe_" + parameter.getSimpleName()));
break;
+ default:
+ throw new UnsupportedOperationException("Unimplemented or invalid kind: " + typeKind);
+ }
+ }
+ return serializeBuilder.build();
+ }
+
+ private MethodSpec buildSerializeMethodWithInstantiatorForAutoValue(
+ TypeElement encodedType, PartitionedParameters parameters) {
+ MethodSpec.Builder serializeBuilder =
+ AutoCodecUtil.initializeSerializeMethodBuilder(encodedType, parameters.dependency);
+ for (VariableElement parameter : parameters.fields) {
+ TypeKind typeKind = parameter.asType().getKind();
+ String getter = "input." + parameter.getSimpleName() + "()";
+ switch (typeKind) {
+ case BOOLEAN:
+ serializeBuilder.addStatement("codedOut.writeBoolNoTag($L)", getter);
+ break;
+ case INT:
+ serializeBuilder.addStatement("codedOut.writeInt32NoTag($L)", getter);
+ break;
+ case ARRAY:
+ // fall through
case DECLARED:
- serializeBuilder.addStatement(
- "$T unsafe_$L = ($T)$T.getInstance().getObject(input, $L_offset)",
- field.asType(),
- parameter.getSimpleName(),
- field.asType(),
- UnsafeProvider.class,
- parameter.getSimpleName());
marshallers.writeSerializationCode(
- new Marshaller.Context(
- serializeBuilder,
- (DeclaredType) parameter.asType(),
- "unsafe_" + parameter.getSimpleName()));
+ new Marshaller.Context(serializeBuilder, parameter.asType(), getter));
break;
default:
throw new UnsupportedOperationException("Unimplemented or invalid kind: " + typeKind);
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 d18a8f0738..3404be03a8 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
@@ -54,6 +54,7 @@ java_library(
":unsafe-provider",
"//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
"//third_party:auto_service",
+ "//third_party:auto_value",
"//third_party:guava",
"//third_party:jsr305",
"//third_party/java/javapoet",