diff options
author | dslomov <dslomov@google.com> | 2017-07-14 11:34:24 +0200 |
---|---|---|
committer | László Csomor <laszlocsomor@google.com> | 2017-07-14 12:55:05 +0200 |
commit | ddc180a1e141d48a2440bab4ffe37b76b6ac731c (patch) | |
tree | fca9b7b1a90ee2e2a3f626ffa7d7d1b8da47c918 /src/test/java/com/google | |
parent | bcde0ed7139041311d659fd013a178f0492dd72c (diff) |
Aspects-on-aspects correctness fix.
Fixes an issue where an aspect propagates over a target that depends on another target
twice with different set of aspects applied.
RELNOTES: None.
PiperOrigin-RevId: 161931168
Diffstat (limited to 'src/test/java/com/google')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java | 62 |
1 files changed, 62 insertions, 0 deletions
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 d0185116e8..f9d10a90d9 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 @@ -2261,6 +2261,68 @@ public class SkylarkAspectsTest extends AnalysisTestCase { "//test:r2_1=False"); } + /** + * r0 is a dependency of r1 via two attributes, dep1 and dep2. + * r1 sends an aspect 'a' along dep1 but not along dep2. + * + * rcollect depends upon r1 and sends another aspect, 'collector', + * along its dep dependency. 'collector' wants to see aspect 'a' and propagates along + * dep1 and dep2. It should be applied both to r0 and to r0+a. + */ + @Test + public void multipleDepsDifferentAspects() throws Exception { + scratch.file( + "test/aspect.bzl", + "PAspect = provider()", + "PCollector = provider()", + "def _aspect_impl(target, ctx):", + " return [PAspect()]", + "a = aspect(_aspect_impl, attr_aspects = ['dep'], provides = [PAspect])", + "def _collector_impl(target, ctx):", + " suffix = '+PAspect' if PAspect in target else ''", + " result = [str(target.label)+suffix]", + " for a in ['dep', 'dep1', 'dep2']:", + " if hasattr(ctx.rule.attr, a):", + " result += getattr(ctx.rule.attr, a)[PCollector].result", + " return [PCollector(result=result)]", + "collector = aspect(_collector_impl, attr_aspects = ['*'], ", + " required_aspect_providers = [PAspect])", + "def _rimpl(ctx):", + " pass", + "r0 = rule(_rimpl)", + "r1 = rule(_rimpl, ", + " attrs = {", + " 'dep1' : attr.label(),", + " 'dep2' : attr.label(aspects = [a]),", + " },", + ")", + "def _rcollect_impl(ctx):", + " return [ctx.attr.dep[PCollector]]", + "rcollect = rule(_rcollect_impl,", + " attrs = {", + " 'dep' : attr.label(aspects = [collector]),", + " })" + ); + scratch.file( + "test/BUILD", + "load(':aspect.bzl', 'r0', 'r1', 'rcollect')", + "r0(name = 'r0')", + "r1(name = 'r1', dep1 = ':r0', dep2 = ':r0')", + "rcollect(name = 'rcollect', dep = ':r1')" + ); + + AnalysisResult analysisResult = update(ImmutableList.of(), "//test:rcollect"); + ConfiguredTarget configuredTarget = + Iterables.getOnlyElement(analysisResult.getTargetsToBuild()); + SkylarkKey pCollector = new SkylarkKey(Label.parseAbsolute("//test:aspect.bzl"), "PCollector"); + assertThat((SkylarkList<?>) configuredTarget.get(pCollector).getValue("result")) + .containsExactly( + "//test:r1", + "//test:r0", + "//test:r0+PAspect"); + } + + /** SkylarkAspectTest with "keep going" flag */ @RunWith(JUnit4.class) |