aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2015-11-26 10:49:16 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2015-11-26 13:19:53 +0000
commit5a8f1c0b1a7a791092f8d274d9f16bae5396bc9c (patch)
tree6904371344f5aebaf038977051a25946a8314316 /src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
parent1f02a434a42cb7ce2cbdad8592709ad518772eb7 (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.java38
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);
}