Add @AutoCodec to SpawnAction. Refactor the SpawnAction API for extra actions so that it is non-generic and does not persist a GeneratedExtension, which is hard to serialize.

PiperOrigin-RevId: 186627440
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupplierImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupplierImpl.java
index c609d3d..89c6741 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupplierImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RunfilesSupplierImpl.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.BaseSpawn;
 import com.google.devtools.build.lib.actions.RunfilesSupplier;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import java.util.Map;
@@ -28,6 +29,7 @@
 
 /** {@link RunfilesSupplier} implementation wrapping a single {@link Runfiles} directory mapping. */
 // TODO(bazel-team): Consider renaming to SingleRunfilesSupplierImpl.
+@AutoCodec
 public class RunfilesSupplierImpl implements RunfilesSupplier {
   private final PathFragment runfilesDir;
   private final Runfiles runfiles;
@@ -60,10 +62,9 @@
    * @param runfiles the runfiles for runilesDir.
    * @param manifest runfiles' associated runfiles manifest artifact, if present.
    */
+  @AutoCodec.Instantiator
   public RunfilesSupplierImpl(
-      PathFragment runfilesDir,
-      Runfiles runfiles,
-      @Nullable Artifact manifest) {
+      PathFragment runfilesDir, Runfiles runfiles, @Nullable Artifact manifest) {
     Preconditions.checkArgument(!runfilesDir.isAbsolute());
     this.runfilesDir = Preconditions.checkNotNull(runfilesDir);
     this.runfiles = Preconditions.checkNotNull(runfiles);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
index badf8ef..23005b7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java
@@ -60,6 +60,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetView;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.LazyString;
@@ -68,7 +69,6 @@
 import com.google.errorprone.annotations.CompileTimeConstant;
 import com.google.errorprone.annotations.FormatMethod;
 import com.google.errorprone.annotations.FormatString;
-import com.google.protobuf.GeneratedMessage.GeneratedExtension;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
@@ -79,22 +79,12 @@
 import javax.annotation.Nullable;
 
 /** An Action representing an arbitrary subprocess to be forked and exec'd. */
+@AutoCodec
 public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifier, CommandAction {
 
-
-  /** Sets extensions on ExtraActionInfo **/
-  protected static class ExtraActionInfoSupplier<T> {
-    private final GeneratedExtension<ExtraActionInfo, T> extension;
-    private final T value;
-
-    protected ExtraActionInfoSupplier(GeneratedExtension<ExtraActionInfo, T> extension, T value) {
-      this.extension = extension;
-      this.value = value;
-    }
-
-    void extend(ExtraActionInfo.Builder builder) {
-      builder.setExtension(extension, value);
-    }
+  /** Sets extensions on {@link ExtraActionInfo}. */
+  public interface ExtraActionInfoSupplier {
+    void extend(ExtraActionInfo.Builder builder);
   }
 
   private static final String GUID = "ebd6fce3-093e-45ee-adb6-bf513b602f0d";
@@ -109,7 +99,7 @@
   private final ResourceSet resourceSet;
   private final ImmutableMap<String, String> executionInfo;
 
-  private final ExtraActionInfoSupplier<?> extraActionInfoSupplier;
+  private final ExtraActionInfoSupplier extraActionInfoSupplier;
 
   /**
    * Constructs a SpawnAction using direct initialization arguments.
@@ -131,6 +121,7 @@
    * @param progressMessage the message printed during the progression of the build.
    * @param mnemonic the mnemonic that is reported in the master log.
    */
+  @AutoCodec.Instantiator
   public SpawnAction(
       ActionOwner owner,
       Iterable<Artifact> tools,
@@ -197,7 +188,7 @@
       RunfilesSupplier runfilesSupplier,
       String mnemonic,
       boolean executeUnconditionally,
-      ExtraActionInfoSupplier<?> extraActionInfoSupplier) {
+      ExtraActionInfoSupplier extraActionInfoSupplier) {
     super(owner, tools, inputs, runfilesSupplier, outputs, env);
     this.resourceSet = resourceSet;
     this.executionInfo = executionInfo;
@@ -611,7 +602,7 @@
 
     private CharSequence progressMessage;
     private String mnemonic = "Unknown";
-    protected ExtraActionInfoSupplier<?> extraActionInfoSupplier = null;
+    protected ExtraActionInfoSupplier extraActionInfoSupplier = null;
     private boolean disableSandboxing = false;
 
     /**
@@ -1346,9 +1337,8 @@
       return this;
     }
 
-    public <T> Builder setExtraActionInfo(
-        GeneratedExtension<ExtraActionInfo, T> extension, T value) {
-      this.extraActionInfoSupplier = new ExtraActionInfoSupplier<>(extension, value);
+    public <T> Builder setExtraActionInfo(ExtraActionInfoSupplier extraActionInfoSupplier) {
+      this.extraActionInfoSupplier = extraActionInfoSupplier;
       return this;
     }
 
@@ -1362,7 +1352,8 @@
    * Command line implementation that optimises for containing executable args, command lines, and
    * command lines spilled to param files.
    */
-  private static class SpawnActionCommandLine extends CommandLine {
+  @AutoCodec
+  static class SpawnActionCommandLine extends CommandLine {
     private final Object[] values;
 
     SpawnActionCommandLine(Object[] values) {