Enable rules to transition based on their Rule objects.

This begins to allow for cases where a rule sets configuration
based on its attributes, such as where a rule attribute names
flags and their values - sort of a reverse select.

There are no such cases yet, but they're coming!

--
PiperOrigin-RevId: 150648357
MOS_MIGRATED_REVID=150648357
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 df50202..6043cda 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
@@ -60,6 +60,7 @@
 import com.google.devtools.build.lib.packages.PackageSpecification;
 import com.google.devtools.build.lib.packages.RawAttributeMapper;
 import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleTransitionFactory;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.pkgcache.LoadingResult;
@@ -855,11 +856,12 @@
 
       Attribute.Transition ruleclassTransition = null;
       if (targetAndConfig.getTarget().getAssociatedRule() != null) {
-        ruleclassTransition = targetAndConfig
-            .getTarget()
-            .getAssociatedRule()
-            .getRuleClassObject()
-            .getTransition();
+        Rule associatedRule = targetAndConfig.getTarget().getAssociatedRule();
+        RuleTransitionFactory transitionFactory =
+            associatedRule.getRuleClassObject().getTransitionFactory();
+        if (transitionFactory != null) {
+          ruleclassTransition = transitionFactory.buildTransitionFor(associatedRule);
+        }
       }
       if (targetAndConfig.getConfiguration() != null) {
         asDeps.put(targetAndConfig.getConfiguration(),