@AutoCodec SkylarkCustomCommandLine. Includes hack to work around b/76233103.

PiperOrigin-RevId: 190349968
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
index 38ba721..d08be01 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
@@ -26,6 +26,8 @@
 import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.events.NullEventHandler;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -39,6 +41,7 @@
 import javax.annotation.Nullable;
 
 /** Supports ctx.actions.args() from Skylark. */
+@AutoCodec
 class SkylarkCustomCommandLine extends CommandLine {
   private final SkylarkSemantics skylarkSemantics;
   private final EventHandler eventHandler;
@@ -47,6 +50,7 @@
   private static final Joiner LINE_JOINER = Joiner.on("\n").skipNulls();
   private static final Joiner FIELD_JOINER = Joiner.on(": ").skipNulls();
 
+  @AutoCodec
   static final class VectorArg {
     private static Interner<VectorArg> interner = BlazeInterners.newStrongInterner();
 
@@ -57,7 +61,7 @@
     private final boolean hasMapFn;
     private final boolean hasLocation;
 
-    VectorArg(
+    private VectorArg(
         boolean isNestedSet,
         boolean hasFormat,
         boolean hasBeforeEach,
@@ -72,18 +76,30 @@
       this.hasLocation = hasLocation;
     }
 
+    @AutoCodec.VisibleForSerialization
+    @AutoCodec.Instantiator
+    static VectorArg create(
+        boolean isNestedSet,
+        boolean hasFormat,
+        boolean hasBeforeEach,
+        boolean hasJoinWith,
+        boolean hasMapFn,
+        boolean hasLocation) {
+      return interner.intern(
+          new VectorArg(isNestedSet, hasFormat, hasBeforeEach, hasJoinWith, hasMapFn, hasLocation));
+    }
+
     private static void push(ImmutableList.Builder<Object> arguments, Builder arg) {
       boolean wantsLocation = arg.format != null || arg.mapFn != null;
       boolean hasLocation = arg.location != null && wantsLocation;
       VectorArg vectorArg =
-          new VectorArg(
+          VectorArg.create(
               arg.nestedSet != null,
               arg.format != null,
               arg.beforeEach != null,
               arg.joinWith != null,
               arg.mapFn != null,
               hasLocation);
-      vectorArg = interner.intern(vectorArg);
       arguments.add(vectorArg);
       if (vectorArg.isNestedSet) {
         arguments.add(arg.nestedSet);
@@ -257,6 +273,7 @@
     }
   }
 
+  @AutoCodec
   static final class ScalarArg {
     private static Interner<ScalarArg> interner = BlazeInterners.newStrongInterner();
 
@@ -264,17 +281,22 @@
     private final boolean hasMapFn;
     private final boolean hasLocation;
 
-    public ScalarArg(boolean hasFormat, boolean hasMapFn, boolean hasLocation) {
+    private ScalarArg(boolean hasFormat, boolean hasMapFn, boolean hasLocation) {
       this.hasFormat = hasFormat;
       this.hasMapFn = hasMapFn;
       this.hasLocation = hasLocation;
     }
 
+    @AutoCodec.VisibleForSerialization
+    @AutoCodec.Instantiator
+    static ScalarArg create(boolean hasFormat, boolean hasMapFn, boolean hasLocation) {
+      return interner.intern(new ScalarArg(hasFormat, hasMapFn, hasLocation));
+    }
+
     private static void push(ImmutableList.Builder<Object> arguments, Builder arg) {
       boolean wantsLocation = arg.format != null || arg.mapFn != null;
       boolean hasLocation = arg.location != null && wantsLocation;
-      ScalarArg scalarArg = new ScalarArg(arg.format != null, arg.mapFn != null, hasLocation);
-      scalarArg = interner.intern(scalarArg);
+      ScalarArg scalarArg = ScalarArg.create(arg.format != null, arg.mapFn != null, hasLocation);
       arguments.add(scalarArg);
       arguments.add(arg.object);
       if (hasLocation) {
@@ -380,14 +402,24 @@
     }
 
     SkylarkCustomCommandLine build() {
-      return new SkylarkCustomCommandLine(this);
+      return new SkylarkCustomCommandLine(skylarkSemantics, eventHandler, arguments.build());
     }
   }
 
-  SkylarkCustomCommandLine(Builder builder) {
-    this.arguments = builder.arguments.build();
-    this.skylarkSemantics = builder.skylarkSemantics;
-    this.eventHandler = builder.eventHandler;
+  @AutoCodec.VisibleForSerialization
+  @AutoCodec.Instantiator
+  SkylarkCustomCommandLine(SkylarkSemantics skylarkSemantics, ImmutableList<Object> arguments) {
+    // TODO(b/76233103): fix this.
+    this(skylarkSemantics, NullEventHandler.INSTANCE, arguments);
+  }
+
+  private SkylarkCustomCommandLine(
+      SkylarkSemantics skylarkSemantics,
+      EventHandler eventHandler,
+      ImmutableList<Object> arguments) {
+    this.skylarkSemantics = skylarkSemantics;
+    this.eventHandler = eventHandler;
+    this.arguments = arguments;
   }
 
   @Override