diff options
author | Michael Staib <mstaib@google.com> | 2016-01-14 22:40:37 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-15 09:24:22 +0000 |
commit | ff66c192d70c6001797369a555cc1786594e10a2 (patch) | |
tree | 4957c64501943dac9d1545c7f1cb3b6bbda4084c /src/main/java/com/google/devtools/build/lib/packages/RuleClass.java | |
parent | 3ec6a0ecf535c96f5b5cd9d2c64f6784bbc2b4bb (diff) |
ConfigurationFragmentPolicy: assume Skylark names, allow merging.
In preparation for allowing aspects to have their own configuration fragments
specified, allow ConfigurationFragmentPolicy.Builder to merge with built policies
more easily, setting up SetMultimaps in place of maps of sets. This changes how
named (Skylark) fragments are declared in the RuleContext builder, hopefully to
be a bit easier to write.
In order to do this, make SkylarkModuleNameResolver the only name resolver in use
(because it is the only name resolver which exists) so as to not worry about
collisions of different name resolvers.
This also changes isLegalConfigurationFragment's one-argument form to mean
"legal in ANY configuration" rather than "legal in the target (NONE)
configuration", as that is how it's used by TransitiveTargetFunction. Uses of it to
mean the latter have been revised to be more explicit.
Also in this CL:
* refactor ConfigurationFragmentPolicy to enforce its contracts about which
ConfigurationTransitions are legal
* use containsEntry or containsValue rather than looking in get(key) or values()
for the configuration fragment multimaps
* add tests for ConfigurationFragmentPolicy
* make SkylarkModuleNameResolver a static method
--
MOS_MIGRATED_REVID=112191439
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages/RuleClass.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/RuleClass.java | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 9ce41f6cd4..92ea112216 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -32,7 +32,6 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.Location; -import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition; import com.google.devtools.build.lib.packages.BuildType.SelectorList; import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy; import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType; @@ -40,7 +39,6 @@ import com.google.devtools.build.lib.packages.RuleFactory.AttributeValuesMap; import com.google.devtools.build.lib.syntax.Argument; import com.google.devtools.build.lib.syntax.BaseFunction; import com.google.devtools.build.lib.syntax.Environment; -import com.google.devtools.build.lib.syntax.FragmentClassNameResolver; import com.google.devtools.build.lib.syntax.FuncallExpression; import com.google.devtools.build.lib.syntax.GlobList; import com.google.devtools.build.lib.syntax.Runtime; @@ -508,8 +506,8 @@ public final class RuleClass { if (parent.preferredDependencyPredicate != Predicates.<String>alwaysFalse()) { setPreferredDependencyPredicate(parent.preferredDependencyPredicate); } - configurationFragmentPolicy.requiresConfigurationFragments( - parent.getConfigurationFragmentPolicy().getRequiredConfigurationFragments()); + configurationFragmentPolicy + .includeConfigurationFragmentsFrom(parent.getConfigurationFragmentPolicy()); configurationFragmentPolicy.setMissingFragmentPolicy( parent.getConfigurationFragmentPolicy().getMissingFragmentPolicy()); supportsConstraintChecking = parent.supportsConstraintChecking; @@ -580,7 +578,8 @@ public final class RuleClass { * <p>The value is inherited by subclasses. */ public Builder requiresConfigurationFragments(Class<?>... configurationFragments) { - configurationFragmentPolicy.requiresConfigurationFragments(configurationFragments); + configurationFragmentPolicy.requiresConfigurationFragments( + ImmutableSet.<Class<?>>copyOf(configurationFragments)); return this; } @@ -591,24 +590,36 @@ public final class RuleClass { * <p>The value is inherited by subclasses. */ public Builder requiresHostConfigurationFragments(Class<?>... configurationFragments) { - configurationFragmentPolicy - .requiresConfigurationFragments(ConfigurationTransition.HOST, configurationFragments); + configurationFragmentPolicy.requiresHostConfigurationFragments( + ImmutableSet.<Class<?>>copyOf(configurationFragments)); return this; } /** - * Declares the configuration fragments that are required by this rule for the specified - * configuration. Valid transition values are HOST for the host configuration and NONE for - * the target configuration. + * Declares the configuration fragments that are required by this rule for the target + * configuration. * * <p>In contrast to {@link #requiresConfigurationFragments(Class...)}, this method takes the - * names of fragments instead of their classes. + * Skylark module names of fragments instead of their classes. */ - public Builder requiresConfigurationFragments( - FragmentClassNameResolver fragmentNameResolver, - Map<ConfigurationTransition, ImmutableSet<String>> configurationFragmentNames) { - configurationFragmentPolicy.requiresConfigurationFragments( - fragmentNameResolver, configurationFragmentNames); + public Builder requiresConfigurationFragmentsBySkylarkModuleName( + Collection<String> configurationFragmentNames) { + configurationFragmentPolicy + .requiresConfigurationFragmentsBySkylarkModuleName(configurationFragmentNames); + return this; + } + + /** + * Declares the configuration fragments that are required by this rule for the host + * configuration. + * + * <p>In contrast to {@link #requiresHostConfigurationFragments(Class...)}, this method takes + * Skylark module names of fragments instead of their classes. + */ + public Builder requiresHostConfigurationFragmentsBySkylarkModuleName( + Collection<String> configurationFragmentNames) { + configurationFragmentPolicy + .requiresHostConfigurationFragmentsBySkylarkModuleName(configurationFragmentNames); return this; } |