Apply @AutoCodec to ExecutableSymlinkAction and SymlinkAction.
AbstractAction had getPrimaryInput() and getPrimaryOutput()
which is why arguments are renamed.

PiperOrigin-RevId: 186795064
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java
index 74131b1..1be6ad2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java
@@ -20,17 +20,20 @@
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.ActionResult;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.vfs.Path;
 import java.io.IOException;
 
 /**
- * Action to create an executable symbolic link. It includes additional
- * validation that symlink target is indeed an executable file.
+ * Action to create an executable symbolic link. It includes additional validation that symlink
+ * target is indeed an executable file.
  */
+@AutoCodec
 public final class ExecutableSymlinkAction extends SymlinkAction {
 
-  public ExecutableSymlinkAction(ActionOwner owner, Artifact input, Artifact output) {
-    super(owner, input, output, "Symlinking " + owner.getLabel());
+  @AutoCodec.Instantiator
+  public ExecutableSymlinkAction(ActionOwner owner, Artifact primaryInput, Artifact primaryOutput) {
+    super(owner, primaryInput, primaryOutput, "Symlinking " + owner.getLabel());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
index 645cd6f..5a74e0b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java
@@ -24,23 +24,21 @@
 import com.google.devtools.build.lib.actions.ActionOwner;
 import com.google.devtools.build.lib.actions.ActionResult;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
 import javax.annotation.Nullable;
 
-/**
- * Action to create a symbolic link.
- */
+/** Action to create a symbolic link. */
+@AutoCodec
 public class SymlinkAction extends AbstractAction {
-
   private static final String GUID = "349675b5-437c-4da8-891a-7fb98fba6ab5";
 
   /** Null when {@link #getPrimaryInput} is the target of the symlink. */
   @Nullable private final PathFragment inputPath;
 
-  private final Artifact output;
   private final String progressMessage;
 
   /**
@@ -57,27 +55,29 @@
     // become the sole and primary in their respective lists.
     super(owner, ImmutableList.of(input), ImmutableList.of(output));
     this.inputPath = null;
-    this.output = Preconditions.checkNotNull(output);
     this.progressMessage = progressMessage;
   }
 
   /**
-   * Creates a new SymlinkAction instance, where the inputPath
-   * may be different than that input artifact's path. This is
-   * only useful when dealing with runfiles trees where
-   * link target is a directory.
+   * Creates a new SymlinkAction instance, where the inputPath may be different than that input
+   * artifact's path. This is only useful when dealing with runfiles trees where link target is a
+   * directory.
    *
    * @param owner the action owner.
    * @param inputPath the Path that will be the src of the symbolic link.
-   * @param input the Artifact that is required to build the inputPath.
-   * @param output the Artifact that will be created by executing this Action.
+   * @param primaryInput the Artifact that is required to build the inputPath.
+   * @param primaryOutput the Artifact that will be created by executing this Action.
    * @param progressMessage the progress message.
    */
-  public SymlinkAction(ActionOwner owner, PathFragment inputPath, Artifact input,
-      Artifact output, String progressMessage) {
-    super(owner, ImmutableList.of(input), ImmutableList.of(output));
-    this.inputPath = Preconditions.checkNotNull(inputPath);
-    this.output = Preconditions.checkNotNull(output);
+  @AutoCodec.Instantiator
+  public SymlinkAction(
+      ActionOwner owner,
+      PathFragment inputPath,
+      Artifact primaryInput,
+      Artifact primaryOutput,
+      String progressMessage) {
+    super(owner, ImmutableList.of(primaryInput), ImmutableList.of(primaryOutput));
+    this.inputPath = inputPath;
     this.progressMessage = progressMessage;
   }
 
@@ -96,7 +96,6 @@
       ActionOwner owner, PathFragment inputPath, Artifact output, String progressMessage) {
     super(owner, Artifact.NO_ARTIFACTS, ImmutableList.of(output));
     this.inputPath = Preconditions.checkNotNull(inputPath);
-    this.output = Preconditions.checkNotNull(output);
     this.progressMessage = progressMessage;
   }
 
@@ -105,7 +104,7 @@
   }
 
   public Path getOutputPath() {
-    return output.getPath();
+    return getPrimaryOutput().getPath();
   }
 
   @Override
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index fad138c..b485dcd 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -637,6 +637,8 @@
         "//src/main/java/com/google/devtools/build/lib:io",
         "//src/main/java/com/google/devtools/build/lib:util",
         "//src/main/java/com/google/devtools/build/lib/actions",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/protobuf:extra_actions_base_java_proto",
         "//third_party:jsr305",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
index b1e63b6..2fd1421 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
@@ -22,8 +22,12 @@
 import com.google.devtools.build.lib.actions.util.DummyExecutor;
 import com.google.devtools.build.lib.analysis.actions.ExecutableSymlinkAction;
 import com.google.devtools.build.lib.exec.SingleBuildFileCache;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestFileOutErr;
+import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import org.junit.Before;
@@ -112,4 +116,35 @@
           .isTrue();
     }
   }
+
+  @Test
+  public void testCodec() throws Exception {
+    Path file = inputRoot.getRoot().getRelative("some-file");
+    FileSystemUtils.createEmptyFile(file);
+    file.setExecutable(/*executable=*/ false);
+    Artifact input = new Artifact(file, inputRoot);
+    Artifact output = new Artifact(outputRoot.getRoot().getRelative("some-output"), outputRoot);
+    ExecutableSymlinkAction action = new ExecutableSymlinkAction(NULL_ACTION_OWNER, input, output);
+    new SerializationTester(action)
+        .setWriteContextFactory(
+            () ->
+                new SerializationContext(
+                    ImmutableMap.of(FileSystem.class, scratch.getFileSystem())))
+        .setReadContextFactory(
+            () ->
+                new DeserializationContext(
+                    ImmutableMap.of(FileSystem.class, scratch.getFileSystem())))
+        .setVerificationFunction(
+            (in, out) -> {
+              ExecutableSymlinkAction inAction = (ExecutableSymlinkAction) in;
+              ExecutableSymlinkAction outAction = (ExecutableSymlinkAction) out;
+              assertThat(inAction.getPrimaryInput().getFilename())
+                  .isEqualTo(outAction.getPrimaryInput().getFilename());
+              assertThat(inAction.getPrimaryOutput().getFilename())
+                  .isEqualTo(outAction.getPrimaryOutput().getFilename());
+              assertThat(inAction.getOwner()).isEqualTo(outAction.getOwner());
+              assertThat(inAction.getProgressMessage()).isEqualTo(outAction.getProgressMessage());
+            })
+        .runTests();
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
index d29e533..caf56bd 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/actions/SymlinkActionTest.java
@@ -24,7 +24,11 @@
 import com.google.devtools.build.lib.actions.Executor;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.exec.util.TestExecutorBuilder;
+import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.TestConstants;
+import com.google.devtools.build.lib.vfs.FileSystem;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import org.junit.Before;
@@ -91,4 +95,29 @@
     assertThat(action.getPrimaryInput()).isEqualTo(inputArtifact);
     assertThat(action.getPrimaryOutput()).isEqualTo(outputArtifact);
   }
+
+  @Test
+  public void testCodec() throws Exception {
+    new SerializationTester(action)
+        .setWriteContextFactory(
+            () ->
+                new SerializationContext(
+                    ImmutableMap.of(FileSystem.class, scratch.getFileSystem())))
+        .setReadContextFactory(
+            () ->
+                new DeserializationContext(
+                    ImmutableMap.of(FileSystem.class, scratch.getFileSystem())))
+        .setVerificationFunction(
+            (in, out) -> {
+              SymlinkAction inAction = (SymlinkAction) in;
+              SymlinkAction outAction = (SymlinkAction) out;
+              assertThat(inAction.getPrimaryInput().getFilename())
+                  .isEqualTo(outAction.getPrimaryInput().getFilename());
+              assertThat(inAction.getPrimaryOutput().getFilename())
+                  .isEqualTo(outAction.getPrimaryOutput().getFilename());
+              assertThat(inAction.getOwner()).isEqualTo(outAction.getOwner());
+              assertThat(inAction.getProgressMessage()).isEqualTo(outAction.getProgressMessage());
+            })
+        .runTests();
+  }
 }