diff options
author | brandjon <brandjon@google.com> | 2018-01-22 10:50:45 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-22 10:52:27 -0800 |
commit | 32d359f4fbde6bfdcfa1beda64a87c407480ba76 (patch) | |
tree | a9ecf4d014fef0d88aa6da6496b4714a9f67d0b4 /src/main/java/com/google/devtools/build/lib | |
parent | 772d958f1577f1697a1112ffbddc23898c11a48b (diff) |
Add a native provider registry to ConfiguredRuleClassProvider
The idea is that rule sets should record what builtin providers (types, not instances) they use, as opposed to having a static registry the way we do for @SkylarkSignature builtins. (It'd be nice for the latter to not be static one day.)
RELNOTES: None
PiperOrigin-RevId: 182802492
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
4 files changed, 27 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 826ce84a35..5a1cc6dd6a 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -935,6 +935,7 @@ java_library( ["rules/core/*.java"], ), deps = [ + ":packages-internal", "//src/main/java/com/google/devtools/build/lib:build-base", "//third_party:guava", ], 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 c52b9476d4..ab0cb03a61 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 @@ -44,6 +44,7 @@ import com.google.devtools.build.lib.graph.Digraph; import com.google.devtools.build.lib.graph.Node; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.NativeAspectClass; +import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.Rule; @@ -200,7 +201,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { * A coherent set of options, fragments, aspects and rules; each of these may declare a dependency * on other such sets. */ - public static interface RuleSet { + public interface RuleSet { /** Add stuff to the configured rule class provider builder. */ void init(ConfiguredRuleClassProvider.Builder builder); @@ -235,6 +236,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableMap.builder(); private ImmutableList.Builder<Class<?>> skylarkModules = ImmutableList.<Class<?>>builder().addAll(SkylarkModules.MODULES); + private ImmutableList.Builder<NativeProvider> nativeProviders = ImmutableList.builder(); private ImmutableBiMap.Builder<String, Class<? extends TransitiveInfoProvider>> registeredSkylarkProviders = ImmutableBiMap.builder(); private Map<String, String> platformRegexps = new TreeMap<>(); @@ -365,6 +367,11 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { return this; } + public Builder addNativeProvider(NativeProvider provider) { + this.nativeProviders.add(provider); + return this; + } + /** * Do not use - this only exists for backwards compatibility! Platform regexps are part of a * legacy mechanism - {@code vardef} - that is not exposed in Bazel. @@ -462,7 +469,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { universalFragment, prerequisiteValidator, skylarkAccessibleTopLevels.build(), - skylarkModules.build()); + skylarkModules.build(), + nativeProviders.build()); } @Override @@ -576,6 +584,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { private final Environment.Frame globals; + private final ImmutableList<NativeProvider> nativeProviders; + private final ImmutableMap<String, Class<?>> configurationFragmentMap; private ConfiguredRuleClassProvider( @@ -594,7 +604,8 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { Class<? extends BuildConfiguration.Fragment> universalFragment, PrerequisiteValidator prerequisiteValidator, ImmutableMap<String, Object> skylarkAccessibleJavaClasses, - ImmutableList<Class<?>> skylarkModules) { + ImmutableList<Class<?>> skylarkModules, + ImmutableList<NativeProvider> nativeProviders) { this.preludeLabel = preludeLabel; this.runfilesPrefix = runfilesPrefix; this.toolsRepository = toolsRepository; @@ -610,6 +621,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { this.universalFragment = universalFragment; this.prerequisiteValidator = prerequisiteValidator; this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules); + this.nativeProviders = nativeProviders; this.configurationFragmentMap = createFragmentMap(configurationFragmentFactories); } @@ -808,4 +820,12 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { fragmentsBuilder.add(getUniversalFragment()); return fragmentsBuilder.build(); } + + /** + * Returns all registered {@link NativeProvider} instances, i.e. all built-in provider types that + * are based on {@link Provider} rather than {@link TransitiveInfoProvider}. + */ + public ImmutableList<NativeProvider> getNativeProviders() { + return nativeProviders; + } } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index f5fadc5677..0e7782c7f7 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -199,7 +199,7 @@ public class BazelRuleClassProvider { @Override public ImmutableList<RuleSet> requires() { - return null; + return ImmutableList.of(); } }; diff --git a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java index 5cfe5939a2..8b293cf622 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java +++ b/src/main/java/com/google/devtools/build/lib/rules/core/CoreRules.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.Builder; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider.RuleSet; import com.google.devtools.build.lib.analysis.test.TestConfiguration; +import com.google.devtools.build.lib.packages.NativeProvider; /** A set of basic rules - Bazel won't work correctly without these. */ public final class CoreRules implements RuleSet { @@ -37,6 +38,7 @@ public final class CoreRules implements RuleSet { builder.addRuleDefinition(new BaseRuleClasses.BinaryBaseRule()); builder.addRuleDefinition(new BaseRuleClasses.TestBaseRule()); builder.addRuleDefinition(new BaseRuleClasses.ErrorRule()); + builder.addNativeProvider(NativeProvider.STRUCT); } @Override |