diff options
author | Dmitry Lomov <dslomov@google.com> | 2016-01-11 18:48:15 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-01-11 20:10:02 +0000 |
commit | a50f5703d280d7db4404258637e19475f712610f (patch) | |
tree | 89cf5060eed7b8c4be896a4749ac393c3bff1108 | |
parent | 37265a87c7aa9743a2b20069be85d03529b18534 (diff) |
Provide rule class name to aspects.
--
MOS_MIGRATED_REVID=111866202
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java | 19 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java | 8 |
2 files changed, 23 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java index 83f24898e0..5b22a0fde0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleContext.java @@ -324,6 +324,7 @@ public final class SkylarkRuleContext { } return new SkylarkRuleAttributesCollection( + ruleContext.getRule().getRuleClass(), attrBuilder.build(), executableBuilder.build(), fileBuilder.build(), @@ -341,13 +342,15 @@ public final class SkylarkRuleContext { private final SkylarkClassObject fileObject; private final SkylarkClassObject filesObject; private final ImmutableMap<Artifact, FilesToRunProvider> executableRunfilesMap; + private final String ruleClassName; private SkylarkRuleAttributesCollection( - ImmutableMap<String, Object> attrs, + String ruleClassName, ImmutableMap<String, Object> attrs, ImmutableMap<String, Object> executables, ImmutableMap<String, Object> singleFiles, ImmutableMap<String, Object> files, ImmutableMap<Artifact, FilesToRunProvider> executableRunfilesMap) { + this.ruleClassName = ruleClassName; attrObject = new SkylarkClassObject( attrs, @@ -390,6 +393,13 @@ public final class SkylarkRuleContext { return filesObject; } + @SkylarkCallable(name = "kind", structField = true, doc = + "The kind of a rule, such as 'cc_library'") + public String getRuleClassName() { + return ruleClassName; + } + + public ImmutableMap<Artifact, FilesToRunProvider> getExecutableRunfilesMap() { return executableRunfilesMap; } @@ -494,10 +504,13 @@ public final class SkylarkRuleContext { return outputsObject; } - @SkylarkCallable(structField = true, doc = "Returns rule attributes descriptor") + @SkylarkCallable(structField = true, + doc = "Returns rule attributes descriptor for the rule that aspect is applied to." + + " Only avaliable in aspect implementation functions.") public SkylarkRuleAttributesCollection rule() throws EvalException { if (ruleAttributesCollection == null) { - throw new EvalException(Location.BUILTIN, "'rule' is not defined"); + throw new EvalException( + Location.BUILTIN, "'rule' is only available in aspect implementations"); } return ruleAttributesCollection; } diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java index a831c73b9c..0e68f6be0b 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java @@ -93,9 +93,11 @@ public class SkylarkAspectsTest extends BuildViewTestCase { "test/aspect.bzl", "def _impl(target, ctx):", " s = set([target.label])", + " c = set([ctx.rule.kind])", " for i in ctx.rule.attr.deps:", " s += i.target_labels", - " return struct(target_labels = s)", + " c += i.rule_kinds", + " return struct(target_labels = s, rule_kinds = c)", "", "MyAspect = aspect(", " implementation=_impl,", @@ -149,6 +151,10 @@ public class SkylarkAspectsTest extends BuildViewTestCase { } })) .containsExactly("//test:xxx", "//test:yyy"); + Object ruleKinds = skylarkProviders.getValue("rule_kinds"); + assertThat(ruleKinds).isInstanceOf(SkylarkNestedSet.class); + assertThat((SkylarkNestedSet) ruleKinds).containsExactly("java_library"); + } @Test |