@AutoCodec @AutoValue support

PiperOrigin-RevId: 184211212
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 52f060f..d648aeb 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 @@
 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 @@
     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 @@
               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 @@
               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 d18a8f0..3404be0 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 @@
         ":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",