From b534e6be304f06a40c10ba7834625c5222bb9154 Mon Sep 17 00:00:00 2001 From: shahan Date: Thu, 1 Feb 2018 16:13:08 -0800 Subject: @AutoCodec @AutoValue support PiperOrigin-RevId: 184211212 --- .../autocodec/AutoCodecProcessor.java | 50 +++++++++++++++------- .../lib/skyframe/serialization/autocodec/BUILD | 1 + 2 files changed, 36 insertions(+), 15 deletions(-) (limited to 'src/main/java') 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", -- cgit v1.2.3