aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java13
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java2
3 files changed, 20 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 731f47985b..04810eef4d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -275,6 +275,11 @@ final class ConfiguredTargetFunction implements SkyFunction {
for (Dependency dep : deps) {
SkyKey depKey = TO_KEYS.apply(dep);
+ // If the same target was declared in different attributes of rule, we should not process it
+ // twice.
+ if (result.containsKey(depKey)) {
+ continue;
+ }
ConfiguredTarget depConfiguredTarget = configuredTargetMap.get(depKey);
for (Class<? extends ConfiguredAspectFactory> depAspect : dep.getAspects()) {
if (!aspectMatchesConfiguredTarget(depConfiguredTarget, depAspect)) {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 4861ace11d..7d17a98cb5 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -124,4 +124,17 @@ public class AspectTest extends AnalysisTestCase {
}
assertContainsEvent("Aspect error");
}
+
+ @Test
+ public void sameTargetInDifferentAttributes() throws Exception {
+ setRules(new TestAspects.BaseRule(), new TestAspects.AspectRequiringRule(),
+ new TestAspects.SimpleRule());
+ pkg("a",
+ "aspect(name='a', foo=[':b'], bar=[':b'])",
+ "aspect(name='b', foo=[])");
+
+ ConfiguredTarget a = getConfiguredTarget("//a:a");
+ assertThat(a.getProvider(TestAspects.RuleInfo.class).getData())
+ .containsExactly("aspect //a:b", "rule //a:a");
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 4d0fa69619..5438b43d6b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -269,6 +269,8 @@ public class TestAspects {
return builder
.add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
.aspect(SimpleAspect.class))
+ .add(attr("bar", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
+ .aspect(SimpleAspect.class))
.build();
}