Add shared value codec for ConfiguredTargetKey.

PiperOrigin-RevId: 663235289
Change-Id: Ia5577dc22e5973a5afee78c48058f520f0e1b6c8
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index e51e03b..a98d800 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -337,9 +337,56 @@
     return key.getOptions().checksum();
   }
 
+  public static ConfiguredTargetKeyValueSharingCodec valueSharingCodec() {
+    return ConfiguredTargetKeyValueSharingCodec.INSTANCE;
+  }
+
+  // TODO: b/359437873 - generate with @AutoCodec.
+  private static class ConfiguredTargetKeyValueSharingCodec
+      extends DeferredObjectCodec<ConfiguredTargetKey> {
+
+    private static final ConfiguredTargetKeyValueSharingCodec INSTANCE =
+        new ConfiguredTargetKeyValueSharingCodec();
+
+    @Override
+    public boolean autoRegister() {
+      return false;
+    }
+
+    @Override
+    public Class<ConfiguredTargetKey> getEncodedClass() {
+      return ConfiguredTargetKey.class;
+    }
+
+    @Override
+    public void serialize(
+        SerializationContext context, ConfiguredTargetKey key, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.putSharedValue(
+          key, /* distinguisher= */ null, ConfiguredTargetKeyCodec.INSTANCE, codedOut);
+    }
+
+    @Override
+    public DeferredValue<ConfiguredTargetKey> deserializeDeferred(
+        AsyncDeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      SimpleDeferredValue<ConfiguredTargetKey> value = SimpleDeferredValue.create();
+      context.getSharedValue(
+          codedIn,
+          /* distinguisher= */ null,
+          ConfiguredTargetKeyCodec.INSTANCE,
+          value,
+          SimpleDeferredValue::set);
+      return value;
+    }
+  }
+
   /** Codec for all {@link ConfiguredTargetKey} subtypes. */
   @Keep
   private static class ConfiguredTargetKeyCodec extends DeferredObjectCodec<ConfiguredTargetKey> {
+
+    private static final ConfiguredTargetKeyCodec INSTANCE = new ConfiguredTargetKeyCodec();
+
     @Override
     public Class<ConfiguredTargetKey> getEncodedClass() {
       return ConfiguredTargetKey.class;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 0913387..beba5f6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -48,6 +48,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
         "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
         "//third_party:guava",
     ],
 )
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
index 217cafd..03d0421 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
 import com.google.devtools.build.lib.runtime.WorkspaceBuilder;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import java.util.function.Supplier;
 
 /** A {@link BlazeModule} to store Skyframe serialization lifecycle hooks. */
@@ -68,7 +69,8 @@
               .add(ArrayCodec.forComponentType(Artifact.class))
               .add(new DeferredNestedSetCodec())
               .add(Label.valueSharingCodec())
-              .add(PackageIdentifier.valueSharingCodec());
+              .add(PackageIdentifier.valueSharingCodec())
+              .add(ConfiguredTargetKey.valueSharingCodec());
       builder =
           CommonSerializationConstants.addStarlarkFunctionality(
               builder, runtime.getRuleClassProvider());
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
index 1201693..e6ac988 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
+import com.google.testing.junit.testparameterinjector.TestParameter;
 import com.google.testing.junit.testparameterinjector.TestParameterInjector;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -25,7 +26,7 @@
 @RunWith(TestParameterInjector.class)
 public final class ConfiguredTargetKeyTest extends BuildViewTestCase {
   @Test
-  public void testCodec() throws Exception {
+  public void testCodec(@TestParameter boolean useSharedValues) throws Exception {
     var nullConfigKey =
         createKey(
             /* useNullConfig= */ true,
@@ -52,14 +53,22 @@
             /* isToolchainKey= */ true,
             /* shouldApplyRuleTransition= */ false);
 
-    new SerializationTester(
-            nullConfigKey,
-            keyWithConfig,
-            keyWithFinalConfig,
-            toolchainKey,
-            toolchainKeyWithFinalConfig)
-        .addDependency(OptionsChecksumCache.class, new MapBackedChecksumCache())
-        .runTests();
+    var tester =
+        new SerializationTester(
+                nullConfigKey,
+                keyWithConfig,
+                keyWithFinalConfig,
+                toolchainKey,
+                toolchainKeyWithFinalConfig)
+            .addDependency(OptionsChecksumCache.class, new MapBackedChecksumCache());
+
+    if (useSharedValues) {
+      tester
+          .addCodec(ConfiguredTargetKey.valueSharingCodec())
+          .makeMemoizingAndAllowFutureBlocking(true);
+    }
+
+    tester.runTests();
   }
 
   private ConfiguredTargetKey createKey(