Deprecate TransitiveInfoCollection#getConfiguration(), adding two new methods, TransitiveInfoCollection#getConfigurationKey() and ConfiguredTarget#getConfigurationChecksum(). These methods currently delegate to #getConfiguration(), but in the future they won't. I hope to get rid of #getConfigurationChecksum(), but I may have to fold the checksum into BuildConfigurationValue.Key or leave it as a separate field in ConfiguredTarget.

Transform a representative (random?) selection of #getConfiguration calls, to show that it's pretty much possible everywhere.

PiperOrigin-RevId: 190474978
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
index 0727e22..a2e3734 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
@@ -16,11 +16,14 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
+import com.google.devtools.build.lib.analysis.configuredtargets.PackageGroupConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.Label;
 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.Order;
 import com.google.devtools.build.lib.packages.RequiredProviders;
+import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -94,13 +97,25 @@
    */
   Label getLabel();
 
+  /** Deprecated! Use {@link #getConfigurationKey} instead. */
+  @Deprecated
+  @Nullable
+  BuildConfiguration getConfiguration();
+
   /**
-   * <p>Returns the {@link BuildConfiguration} for which this transitive info collection is defined.
-   * Configuration is defined for all configured targets with exception of {@link
-   * InputFileConfiguredTarget} and {@link PackageGroupConfiguredTarget} for which it is always
-   * <b>null</b>.</p>
+   * Returns the {@link BuildConfigurationValue.Key} naming the {@link BuildConfiguration} for which
+   * this transitive info collection is defined. Configuration is defined for all configured targets
+   * with exception of {@link InputFileConfiguredTarget} and {@link PackageGroupConfiguredTarget}
+   * for which it is always <b>null</b>.
    */
-  @Nullable BuildConfiguration getConfiguration();
+  @Nullable
+  default BuildConfigurationValue.Key getConfigurationKey() {
+    BuildConfiguration configuration = getConfiguration();
+    return configuration == null
+        ? null
+        : BuildConfigurationValue.key(
+            configuration.fragmentClasses(), configuration.getBuildOptionsDiff());
+  }
 
   /**
    * Checks whether this {@link TransitiveInfoCollection} satisfies given {@link RequiredProviders}.