Delete top-level rule transition logic from ConfiguredTarget test code.

This is no longer needed now that rule transitions are always applied
by ConfiguredTargetFunction.

* Cleans up references to no longer existing PrepareAnalysisPhaseFunction.

PiperOrigin-RevId: 535905468
Change-Id: I2733a2148fa9f070a0ce5c1f85b80368dde89ffa
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index cec2f00..c3891df 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -180,7 +180,6 @@
    *
    * <p>Preserves the original input ordering.
    */
-  // Keep this in sync with PrepareAnalysisPhaseFunction.
   public static TopLevelTargetsAndConfigsResult getTargetsWithConfigs(
       BuildConfigurationValue targetConfiguration,
       Collection<Target> targets,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
index fbe68d4..a7b99a5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigurationResolver.java
@@ -437,7 +437,6 @@
   //   should never make it through analysis (and especially not seed ConfiguredTargetValues)
   // TODO(gregce): merge this more with resolveConfigurations? One crucial difference is
   //   resolveConfigurations can null-return on missing deps since it executes inside Skyfunctions.
-  // Keep this in sync with {@link PrepareAnalysisPhaseFunction#resolveConfigurations}.
   public static TopLevelTargetsAndConfigsResult getConfigurationsFromExecutor(
       Iterable<TargetAndConfiguration> defaultContext,
       Multimap<BuildConfigurationValue, DependencyKey> targetsToEvaluate,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java b/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
index ae4338d..c83cff9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/producers/TargetAndConfigurationProducer.java
@@ -164,30 +164,47 @@
     // this. It won't be possible afterwards because null configuration keys will only be used for
     // visibility dependencies.
     BuildConfigurationKey configurationKey = preRuleTransitionKey.getConfigurationKey();
-    if ((configurationKey != null) != target.isConfigurable()) {
-      // We somehow ended up in a target that requires a non-null configuration as a dependency of
-      // one that requires a null configuration or the other way round. This is always an error, but
-      // we need to analyze the dependencies of the latter target to realize that. Short-circuit the
-      // evaluation to avoid doing useless work and running code with a null configuration that's
-      // not prepared for it.
-      sink.acceptTargetAndConfigurationError(
-          TargetAndConfigurationError.of(new InconsistentNullConfigException()));
-      return DONE;
-    }
-
-    // TODO(b/261521010): after removing the rule transition from dependency resolution, the logic
-    // here changes.
-    //
-    // A null configuration key will only be used for visibility dependencies so when that's true, a
-    // check that the target is a PackageGroup will be performed, throwing
-    // InvalidVisibilityDependencyException on failure.
     if (configurationKey == null) {
+      if (target.isConfigurable()) {
+        // We somehow ended up in a target that requires a non-null configuration but with a key
+        // that doesn't have a configuration. This is always an error, but we need to analyze the
+        // dependencies of the latter target to realize that. Short-circuit the evaluation to avoid
+        // doing useless work and running code with a null configuration that's not prepared for it.
+        sink.acceptTargetAndConfigurationError(
+            TargetAndConfigurationError.of(new InconsistentNullConfigException()));
+        return DONE;
+      }
+      // TODO(b/261521010): after removing the rule transition from dependency resolution, the logic
+      // here changes.
+      //
+      // A null configuration key will only be used for visibility dependencies so when that's
+      // true, a check that the target is a PackageGroup will be performed, throwing
+      // InvalidVisibilityDependencyException on failure.
+      //
       // The ConfiguredTargetKey cannot fan-in in this case.
       sink.acceptTargetAndConfiguration(
           new TargetAndConfiguration(target, /* configuration= */ null), preRuleTransitionKey);
       return DONE;
     }
 
+    // This may happen for top-level ConfiguredTargets.
+    //
+    // TODO(b/261521010): this may also happen for targets that are not top-level after removing
+    // rule transitions from dependency resolution. Update this comment.
+    if (!target.isConfigurable()) {
+      var nullConfiguredTargetKey =
+          ConfiguredTargetKey.builder().setDelegate(preRuleTransitionKey).build();
+      ActionLookupKey delegate = nullConfiguredTargetKey.toKey();
+      if (!delegate.equals(preRuleTransitionKey)) {
+        // Delegates to the key that already owns the null configuration.
+        delegateTo(tasks, delegate);
+        return DONE;
+      }
+      sink.acceptTargetAndConfiguration(
+          new TargetAndConfiguration(target, /* configuration= */ null), nullConfiguredTargetKey);
+      return DONE;
+    }
+
     return new RuleTransitionConfigurationProducer();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b4eaf60..2e055bf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -1747,7 +1747,7 @@
       ExtendedEventHandler eventHandler,
       BuildConfigurationValue originalConfig,
       Iterable<DependencyKey> keys)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
+      throws InvalidConfigurationException, InterruptedException {
     return getConfiguredTargetMapForTesting(eventHandler, originalConfig, keys).values().asList();
   }
 
@@ -1996,7 +1996,6 @@
    *
    * <p>Skips targets with loading phase errors.
    */
-  // Keep this in sync with {@link PrepareAnalysisPhaseFunction#getConfigurations}.
   // TODO(ulfjack): Remove this legacy method after switching to the Skyframe-based implementation.
   @Override
   public ConfigurationsResult getConfigurations(
@@ -2205,22 +2204,12 @@
   @VisibleForTesting
   @Nullable
   public ConfiguredTarget getConfiguredTargetForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-    return getConfiguredTargetForTesting(eventHandler, label, configuration, NoTransition.INSTANCE);
-  }
-
-  /** Returns a particular configured target after applying the given transition. */
-  @VisibleForTesting
-  @Nullable
-  public ConfiguredTarget getConfiguredTargetForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfigurationValue configuration,
-      ConfigurationTransition transition)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
+      @Nullable BuildConfigurationValue configuration)
+      throws InvalidConfigurationException, InterruptedException {
     ConfiguredTargetAndData configuredTargetAndData =
-        getConfiguredTargetAndDataForTesting(eventHandler, label, configuration, transition);
+        getConfiguredTargetAndDataForTesting(eventHandler, label, configuration);
     return configuredTargetAndData == null ? null : configuredTargetAndData.getConfiguredTarget();
   }
 
@@ -2229,29 +2218,19 @@
   public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
       ExtendedEventHandler eventHandler,
       Label label,
-      BuildConfigurationValue configuration,
-      ConfigurationTransition transition)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-
-    ConfigurationTransition transition1 =
-        configuration == null ? NullTransition.INSTANCE : transition;
+      @Nullable BuildConfigurationValue configuration)
+      throws InvalidConfigurationException, InterruptedException {
     DependencyKey dependencyKey =
-        DependencyKey.builder().setLabel(label).setTransition(transition1).build();
+        DependencyKey.builder()
+            .setLabel(label)
+            .setTransition(configuration == null ? NullTransition.INSTANCE : NoTransition.INSTANCE)
+            .build();
     return Iterables.getFirst(
         getConfiguredTargetsForTesting(
             eventHandler, configuration, ImmutableList.of(dependencyKey)),
         null);
   }
 
-  @VisibleForTesting
-  @Nullable
-  public ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
-      ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue configuration)
-      throws TransitionException, InvalidConfigurationException, InterruptedException {
-    return getConfiguredTargetAndDataForTesting(
-        eventHandler, label, configuration, NoTransition.INSTANCE);
-  }
-
   /**
    * Invalidates Skyframe values corresponding to the given set of modified files under the given
    * path entry.
@@ -2823,6 +2802,11 @@
     return statusReporterRef.get();
   }
 
+  @VisibleForTesting
+  public void clearEmittedEventStateForTesting() {
+    emittedEventState.clear();
+  }
+
   /**
    * Initializes and syncs the graph with the given options, readying it for the next evaluation.
    *
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 643573d..ae534b6 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -43,11 +43,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.TransitionResolver;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
-import com.google.devtools.build.lib.analysis.starlark.StarlarkTransition;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelLockFileFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.BazelModuleResolutionFunction;
 import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry;
@@ -61,8 +57,6 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.exec.ExecutionOptions;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.NoSuchPackageException;
-import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
@@ -553,9 +547,7 @@
     }
     try {
       return skyframeExecutor.getConfiguredTargetAndDataForTesting(reporter, parsedLabel, config);
-    } catch (StarlarkTransition.TransitionException
-        | InvalidConfigurationException
-        | InterruptedException e) {
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
@@ -603,22 +595,9 @@
       throw new AssertionError(e);
     }
     try {
-      // Need to emulate the activities of the top-level trimming transition since not going
-      // through sufficiently normal evaluation channels.
-      Target target = skyframeExecutor.getPackageManager().getTarget(reporter, parsedLabel);
-      ConfigurationTransition transition =
-          TransitionResolver.evaluateTransition(
-              configuration,
-              NoTransition.INSTANCE,
-              target,
-              ruleClassProvider.getTrimmingTransitionFactory());
       return skyframeExecutor.getConfiguredTargetAndDataForTesting(
-          reporter, parsedLabel, configuration, transition);
-    } catch (StarlarkTransition.TransitionException
-        | InvalidConfigurationException
-        | InterruptedException
-        | NoSuchPackageException
-        | NoSuchTargetException e) {
+          reporter, parsedLabel, configuration);
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index aa2c41c..64c494c 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -71,9 +71,6 @@
 import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
 import com.google.devtools.build.lib.analysis.config.DependencyEvaluationException;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.config.TransitionResolver;
-import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
-import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget;
 import com.google.devtools.build.lib.analysis.constraints.IncompatibleTargetChecker.IncompatibleTargetException;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
@@ -518,30 +515,6 @@
     return result;
   }
 
-  private ConfigurationTransition getTopLevelTransitionForTarget(
-      Label label, BuildConfigurationValue config, ExtendedEventHandler handler) {
-    Target target;
-    try {
-      target = skyframeExecutor.getPackageManager().getTarget(handler, label);
-    } catch (NoSuchPackageException | NoSuchTargetException e) {
-      // TODO(bazel-team): refactor this method so we actually throw an exception here (likely
-      // {@link TransitionException}. Every version of getConfiguredTarget runs through this
-      // method and many test cases rely on not erroring out here so be able to reach an error
-      // later on.
-      return NoTransition.INSTANCE;
-    } catch (InterruptedException e) {
-      Thread.currentThread().interrupt();
-      throw new AssertionError("Configuration of " + label + " interrupted");
-    }
-    // Return early if a rule target is in error. We don't want whatever caused the rule error to
-    // also cause problems in computing the transition (e.g. an unchecked exception).
-    if (target instanceof Rule && ((Rule) target).containsErrors()) {
-      return null;
-    }
-    return TransitionResolver.evaluateTransition(
-        config, NoTransition.INSTANCE, target, ruleClassProvider.getTrimmingTransitionFactory());
-  }
-
   /**
    * Returns a configured target for the specified target and configuration. If the target in
    * question has a top-level rule class transition, that transition is applied in the returned
@@ -551,27 +524,14 @@
    */
   public ConfiguredTarget getConfiguredTargetForTesting(
       ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue config)
-      throws StarlarkTransition.TransitionException, InvalidConfigurationException,
-          InterruptedException {
-    ConfigurationTransition transition =
-        getTopLevelTransitionForTarget(label, config, eventHandler);
-    if (transition == null) {
-      return null;
-    }
-    return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config, transition);
+      throws InvalidConfigurationException, InterruptedException {
+    return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config);
   }
 
   ConfiguredTargetAndData getConfiguredTargetAndDataForTesting(
       ExtendedEventHandler eventHandler, Label label, BuildConfigurationValue config)
-      throws StarlarkTransition.TransitionException, InvalidConfigurationException,
-          InterruptedException {
-    ConfigurationTransition transition =
-        getTopLevelTransitionForTarget(label, config, eventHandler);
-    if (transition == null) {
-      return null;
-    }
-    return skyframeExecutor.getConfiguredTargetAndDataForTesting(
-        eventHandler, label, config, transition);
+      throws InvalidConfigurationException, InterruptedException {
+    return skyframeExecutor.getConfiguredTargetAndDataForTesting(eventHandler, label, config);
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index a2aab1e..0c69cdc 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -1056,9 +1056,7 @@
   protected ConfiguredTarget getConfiguredTarget(Label label, BuildConfigurationValue config) {
     try {
       return view.getConfiguredTargetForTesting(reporter, label, config);
-    } catch (InvalidConfigurationException
-        | StarlarkTransition.TransitionException
-        | InterruptedException e) {
+    } catch (InvalidConfigurationException | InterruptedException e) {
       throw new AssertionError(e);
     }
   }
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
index e9e208f..25c2499 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkIntegrationTest.java
@@ -2987,7 +2987,10 @@
     assertContainsEvent("bad transition");
 
     // Try #2: make sure the cache doesn't suppress the error message.
+    invalidatePackages();
+    skyframeExecutor.clearEmittedEventStateForTesting();
     eventCollector.clear();
+
     getConfiguredTarget("//test:mytarget");
     assertContainsEvent("bad transition");
   }
diff --git a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
index 71dbb7c..6c84ba2 100644
--- a/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java
@@ -27,7 +27,7 @@
 import com.google.common.collect.Lists;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
-import com.google.devtools.build.lib.actions.ActionLookupKey;
+import com.google.devtools.build.lib.actions.ActionLookupKeyOrProxy;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander;
 import com.google.devtools.build.lib.actions.Artifact.DerivedArtifact;
@@ -3167,7 +3167,7 @@
             DerivedArtifact.create(
                 artifact.getRoot(),
                 artifact.getExecPath().getRelative(file),
-                (ActionLookupKey) artifact.getArtifactOwner()));
+                (ActionLookupKeyOrProxy) artifact.getArtifactOwner()));
       }
     };
   }