diff options
author | 2015-11-26 10:49:16 +0000 | |
---|---|---|
committer | 2015-11-26 13:19:53 +0000 | |
commit | 5a8f1c0b1a7a791092f8d274d9f16bae5396bc9c (patch) | |
tree | 6904371344f5aebaf038977051a25946a8314316 /src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java | |
parent | 1f02a434a42cb7ce2cbdad8592709ad518772eb7 (diff) |
Implement Skylark aspects originating from Skylark rules.
--
MOS_MIGRATED_REVID=108777120
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java index 63b6307525..df27c88169 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java @@ -89,6 +89,7 @@ import com.google.devtools.build.lib.util.Pair; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ExecutionException; /** @@ -423,8 +424,17 @@ public class SkylarkRuleClassFunctions { + "', test rule class names must end with '_test' and other rule classes must not"); } for (Pair<String, SkylarkAttr.Descriptor> attribute : attributes) { + SkylarkAttr.Descriptor descriptor = attribute.getSecond(); + Attribute.Builder<?> attributeBuilder = descriptor.getAttributeBuilder(); + for (SkylarkAspect skylarkAspect : descriptor.getAspects()) { + if (!skylarkAspect.isExported()) { + throw new EvalException(definitionLocation, + "All aspects applied to rule dependencies must be top-level values"); + } + attributeBuilder.aspect(new SkylarkAspectClass(skylarkAspect)); + } addAttribute(definitionLocation, builder, - attribute.getSecond().getAttributeBuilder().build(attribute.getFirst())); + descriptor.getAttributeBuilder().build(attribute.getFirst())); } this.ruleClass = builder.build(ruleClassName); @@ -441,7 +451,25 @@ public class SkylarkRuleClassFunctions { public static void exportRuleFunctionsAndAspects(Environment env, Label skylarkLabel) throws EvalException { - for (String name : env.getGlobals().getDirectVariableNames()) { + Set<String> globalNames = env.getGlobals().getDirectVariableNames(); + + // Export aspects first since rules can depend on aspects. + for (String name : globalNames) { + Object value; + try { + value = env.lookup(name); + } catch (NoSuchVariableException e) { + throw new AssertionError(e); + } + if (value instanceof SkylarkAspect) { + SkylarkAspect skylarkAspect = (SkylarkAspect) value; + if (!skylarkAspect.isExported()) { + skylarkAspect.export(skylarkLabel, name); + } + } + } + + for (String name : globalNames) { try { Object value = env.lookup(name); if (value instanceof RuleFunction) { @@ -450,12 +478,6 @@ public class SkylarkRuleClassFunctions { function.export(skylarkLabel, name); } } - if (value instanceof SkylarkAspect) { - SkylarkAspect skylarkAspect = (SkylarkAspect) value; - if (!skylarkAspect.isExported()) { - skylarkAspect.export(skylarkLabel, name); - } - } } catch (NoSuchVariableException e) { throw new AssertionError(e); } |