Introduces a registry of native providers to the BuildConfiguration, which can be added to by fragments. Uses the registry to enable native access to TranstiveProviderInstances from Skylark. In particular, makes ObjcProvider accessible to skylark rule implementations.
--
MOS_MIGRATED_REVID=121390911
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index a39737c..be01445 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -21,6 +21,7 @@
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
@@ -106,6 +107,9 @@
private ImmutableList.Builder<Class<?>> skylarkModules =
ImmutableList.<Class<?>>builder().addAll(SkylarkModules.MODULES);
private final List<Class<? extends FragmentOptions>> buildOptions = Lists.newArrayList();
+ private ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ registeredSkylarkProviders = ImmutableBiMap.of();
+
public void addWorkspaceFilePrefix(String contents) {
defaultWorkspaceFilePrefix.append(contents);
@@ -198,6 +202,16 @@
return this;
}
+ /**
+ * Registers a map that indicates which keys in structs returned by skylark rules should be
+ * interpreted as native TransitiveInfoProvider instances of type (map value).
+ */
+ public Builder setSkylarkProviderRegistry(
+ ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> providers) {
+ this.registeredSkylarkProviders = providers;
+ return this;
+ }
+
private RuleConfiguredTargetFactory createFactory(
Class<? extends RuleConfiguredTargetFactory> factoryClass) {
try {
@@ -274,7 +288,8 @@
prerequisiteValidator,
skylarkAccessibleTopLevels,
skylarkModules.build(),
- buildOptions);
+ buildOptions,
+ registeredSkylarkProviders);
}
@Override
@@ -373,6 +388,9 @@
private final Environment.Frame globals;
private final List<Class<? extends FragmentOptions>> buildOptions;
+
+ private final ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ registeredSkylarkProviders;
private ConfiguredRuleClassProvider(
Label preludeLabel,
@@ -391,7 +409,8 @@
PrerequisiteValidator prerequisiteValidator,
ImmutableMap<String, Object> skylarkAccessibleJavaClasses,
ImmutableList<Class<?>> skylarkModules,
- List<Class<? extends FragmentOptions>> buildOptions) {
+ List<Class<? extends FragmentOptions>> buildOptions,
+ ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>> registeredSkylarkProviders) {
this.preludeLabel = preludeLabel;
this.runfilesPrefix = runfilesPrefix;
this.toolsRepository = toolsRepository;
@@ -408,6 +427,7 @@
this.prerequisiteValidator = prerequisiteValidator;
this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules);
this.buildOptions = buildOptions;
+ this.registeredSkylarkProviders = registeredSkylarkProviders;
}
public PrerequisiteValidator getPrerequisiteValidator() {
@@ -507,6 +527,19 @@
}
/**
+ * Returns a map that indicates which keys in structs returned by skylark rules should be
+ * interpreted as native TransitiveInfoProvider instances of type (map value).
+ *
+ * <p>That is, if this map contains "dummy" -> DummyProvider.class, a "dummy" entry in a skylark
+ * rule implementations returned struct will be exported from that ConfiguredTarget as a
+ * DummyProvider.
+ */
+ public ImmutableBiMap<String, Class<? extends TransitiveInfoProvider>>
+ getRegisteredSkylarkProviders() {
+ return this.registeredSkylarkProviders;
+ }
+
+ /**
* Creates a BuildOptions class for the given options taken from an optionsProvider.
*/
public BuildOptions createBuildOptions(OptionsClassProvider optionsProvider) {