Factor out BuildConfigurationCollection.Transitions.getDynamicTransition.

This is a legacy dependency on the configuration transition table, which is
only needed for static configurations. Dynamic configurations didn't actually
use anything in that table: this was just a convenience interface that could
have equally been defined somewhere else. So this cl defines it somewhere else.

There's still one last dependency: Transitions.configurationHook. We'll tackle
that in a followup cl.

PiperOrigin-RevId: 161141650
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
index b515fd7..be1354b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java
@@ -39,15 +39,14 @@
 public class BuildConfigurationFunction implements SkyFunction {
 
   private final BlazeDirectories directories;
-  private final RuleClassProvider ruleClassProvider;
+  private final ConfiguredRuleClassProvider ruleClassProvider;
   private final ConfigurationCollectionFactory collectionFactory;
 
   public BuildConfigurationFunction(BlazeDirectories directories,
       RuleClassProvider ruleClassProvider) {
     this.directories = directories;
-    this.ruleClassProvider = ruleClassProvider;
-    collectionFactory =
-        ((ConfiguredRuleClassProvider) ruleClassProvider).getConfigurationCollectionFactory();
+    this.ruleClassProvider = (ConfiguredRuleClassProvider) ruleClassProvider;
+    collectionFactory = this.ruleClassProvider.getConfigurationCollectionFactory();
   }
 
   @Override
@@ -75,14 +74,17 @@
       fragmentsMap.put(fragment.getClass(), fragment);
     }
 
-    BuildConfiguration config = new BuildConfiguration(directories, fragmentsMap,
-        key.getBuildOptions(), workspaceNameValue.getName());
+    BuildConfiguration config =
+        new BuildConfiguration(
+            directories,
+            fragmentsMap,
+            key.getBuildOptions(),
+            workspaceNameValue.getName(),
+            ruleClassProvider.getDynamicTransitionMapper());
     // Unlike static configurations, dynamic configurations don't need to embed transition logic
-    // within the configuration itself. However we still use this interface to provide a mapping
-    // between Transition types (e.g. HOST) and the dynamic transitions that apply those
-    // transitions. Once static configurations are cleaned out we won't need this interface
-    // any more (all the centralized logic that maintains the transition logic can be distributed
-    // to the actual rule code that uses it).
+    // in the configuration itself. However we still use this interface to supply
+    // BuildConfigurationCollection.Transitions.configurationHook. Once we remove that dependency
+    // we can remove the below completely.
     config.setConfigurationTransitions(collectionFactory.getDynamicTransitionLogic(config));
 
     return new BuildConfigurationValue(config);