Unit tests respect top-level rule-class transitions.
--
PiperOrigin-RevId: 151129669
MOS_MIGRATED_REVID=151129669
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 6043cda..3431013 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -54,8 +54,12 @@
import com.google.devtools.build.lib.packages.AspectDescriptor;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
+import com.google.devtools.build.lib.packages.Attribute.Transition;
import com.google.devtools.build.lib.packages.BuildType;
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.NoSuchThingException;
import com.google.devtools.build.lib.packages.PackageSpecification;
import com.google.devtools.build.lib.packages.RawAttributeMapper;
@@ -1088,14 +1092,39 @@
return result;
}
+ private Transition getTopLevelTransitionForTarget(Label label, ExtendedEventHandler handler) {
+ Rule rule;
+ try {
+ rule = skyframeExecutor
+ .getPackageManager()
+ .getTarget(handler, label)
+ .getAssociatedRule();
+ } catch (NoSuchPackageException | NoSuchTargetException e) {
+ return ConfigurationTransition.NONE;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ throw new AssertionError("Configuration of " + label + " interrupted");
+ }
+ if (rule == null) {
+ return ConfigurationTransition.NONE;
+ }
+ RuleTransitionFactory factory = rule
+ .getRuleClassObject()
+ .getTransitionFactory();
+ return (factory == null) ? ConfigurationTransition.NONE : factory.buildTransitionFor(rule);
+ }
+
/**
- * Returns a configured target for the specified target and configuration. Returns {@code null} if
- * something goes wrong.
+ * Returns a configured target for the specified target and configuration. If dynamic
+ * configurations are activated, and the target in question has a top-level rule class transition,
+ * that transition is applied in the returned ConfiguredTarget. Returns {@code null} if something
+ * goes wrong.
*/
@VisibleForTesting
public ConfiguredTarget getConfiguredTargetForTesting(
ExtendedEventHandler eventHandler, Label label, BuildConfiguration config) {
- return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config);
+ return skyframeExecutor.getConfiguredTargetForTesting(eventHandler, label, config,
+ getTopLevelTransitionForTarget(label, eventHandler));
}
/**