Implement Skylark aspects originating from Skylark rules. -- MOS_MIGRATED_REVID=108777120
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 b12ccd0..b3b6bc9 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
@@ -141,6 +141,80 @@ .containsExactly("//test:xxx", "//test:yyy"); } + + public void testAspectsFromSkylarkRules() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _impl(target, ctx):", + " s = set([target.label])", + " for i in ctx.attr.deps:", + " s += i.target_labels", + " return struct(target_labels = s)", + "def _rule_impl(ctx):", + " s = set([])", + " for i in ctx.attr.attr:", + " s += i.target_labels", + " return struct(rule_deps = s)", + "", + "MyAspect = aspect(", + " implementation=_impl,", + " attr_aspects=['deps'],", + ")", + "my_rule = rule(", + " implementation=_rule_impl,", + " attrs = { 'attr' : ", + " attr.label_list(mandatory=True, allow_files=True, aspects = [MyAspect]) },", + ")"); + + scratch.file( + "test/BUILD", + "load('/test/aspect', 'my_rule')", + "java_library(", + " name = 'yyy',", + ")", + "my_rule(", + " name = 'xxx',", + " attr = [':yyy'],", + ")"); + + AnalysisResult analysisResult = + update( + ImmutableList.of("//test:xxx"), + ImmutableList.<String>of(), + false, + LOADING_PHASE_THREADS, + true, + new EventBus()); + assertThat( + transform( + analysisResult.getTargetsToBuild(), + new Function<ConfiguredTarget, String>() { + @Nullable + @Override + public String apply(ConfiguredTarget configuredTarget) { + return configuredTarget.getLabel().toString(); + } + })) + .containsExactly("//test:xxx"); + ConfiguredTarget target = analysisResult.getTargetsToBuild().iterator().next(); + SkylarkProviders skylarkProviders = target.getProvider(SkylarkProviders.class); + assertThat(skylarkProviders).isNotNull(); + Object names = skylarkProviders.getValue("rule_deps"); + assertThat(names).isInstanceOf(SkylarkNestedSet.class); + assertThat( + transform( + (SkylarkNestedSet) names, + new Function<Object, String>() { + @Nullable + @Override + public String apply(Object o) { + assertThat(o).isInstanceOf(Label.class); + return o.toString(); + } + })) + .containsExactly("//test:yyy"); + } + public void testAspectFailingExecution() throws Exception { scratch.file( "test/aspect.bzl",
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java index bca93ac..83ea26a 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -178,6 +178,30 @@ } @Test + public void testLabelListWithAspects() throws Exception { + SkylarkAttr.Descriptor attr = + (SkylarkAttr.Descriptor) evalRuleClassCode( + "def _impl(target, ctx):", + " pass", + "my_aspect = aspect(implementation = _impl)", + "attr.label_list(aspects = [my_aspect])"); + Object aspect = ev.lookup("my_aspect"); + assertThat(aspect).isNotNull(); + assertThat(attr.getAspects()).containsExactly(aspect); + } + + @Test + public void testLabelListWithAspectsError() throws Exception { + checkErrorContains( + "Expected a list of aspects for 'aspects'", + "def _impl(target, ctx):", + " pass", + "my_aspect = aspect(implementation = _impl)", + "attr.label_list(aspects = [my_aspect, 123])" + ); + } + + @Test public void testNonLabelAttrWithProviders() throws Exception { checkErrorContains( "unexpected keyword 'providers' in call to string", "attr.string(providers = ['a'])");