Do not execute aspect implementation if target advertizes but fails to provide a provider.
Previously we always executed the function, but didn't add the aspect to
the deps.
--
PiperOrigin-RevId: 148887089
MOS_MIGRATED_REVID=148887089
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 438c0d4..48563a1 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
@@ -129,6 +129,74 @@
}
@Test
+ public void aspectIsNotCreatedIfAdvertisedProviderIsNotPresentWithAlias() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.LiarRule(),
+ new TestAspects.AspectRequiringProviderRule());
+
+ pkg("a",
+ "aspect_requiring_provider(name='a', foo=[':b'])",
+ "alias(name = 'b_alias', actual = ':b')",
+ "liar(name='b', foo=[])");
+
+ ConfiguredTarget a = getConfiguredTarget("//a:a");
+ assertThat(a.getProvider(RuleInfo.class).getData()).containsExactly("rule //a:a");
+ }
+
+ @Test
+ public void aspectIsNotPropagatedThroughLiars() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(),
+ new TestAspects.LiarRule(),
+ new TestAspects.HonestRule(),
+ new TestAspects.AspectRequiringProviderRule());
+
+ pkg("a",
+ "aspect_requiring_provider(name='a', foo=[':b_alias'])",
+ "alias(name = 'b_alias', actual = ':b')",
+ "liar(name='b', foo=[':c'])",
+ "honest(name = 'c', foo = [])"
+ );
+
+ ConfiguredTarget a = getConfiguredTarget("//a:a");
+ assertThat(a.getProvider(RuleInfo.class).getData()).containsExactly("rule //a:a");
+ }
+
+ @Test
+ public void aspectPropagatedThroughAliasRule() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.HonestRule(),
+ new TestAspects.AspectRequiringProviderRule());
+
+ pkg("a",
+ "aspect_requiring_provider(name='a', foo=[':b_alias'])",
+ "alias(name = 'b_alias', actual = ':b')",
+ "honest(name='b', foo=[])");
+
+ ConfiguredTarget a = getConfiguredTarget("//a:a");
+ assertThat(a.getProvider(RuleInfo.class).getData()).containsExactly(
+ "rule //a:a", "aspect //a:b");
+ }
+
+ @Test
+ public void aspectPropagatedThroughAliasRuleAndHonestRules() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.HonestRule(),
+ new TestAspects.AspectRequiringProviderRule());
+
+ pkg("a",
+ "aspect_requiring_provider(name='a', foo=[':b'])",
+ "alias(name = 'b_alias', actual = ':b')",
+ "honest(name='b', foo=[':c'])",
+ "honest(name='c', foo=[])"
+ );
+
+ ConfiguredTarget a = getConfiguredTarget("//a:a");
+ assertThat(a.getProvider(RuleInfo.class).getData()).containsExactly(
+ "rule //a:a", "aspect //a:b", "aspect //a:c");
+ }
+
+
+
+
+
+ @Test
public void aspectCreationWorksThroughBind() throws Exception {
setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.HonestRule(),
new TestAspects.AspectRequiringProviderRule());
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 2f5595f..e8bad99 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
@@ -384,6 +384,7 @@
private static final AspectDefinition ASPECT_REQUIRING_PROVIDER_DEFINITION =
new AspectDefinition.Builder(ASPECT_REQUIRING_PROVIDER)
.requireProviders(RequiredProvider.class)
+ .propagateAlongAttribute("foo")
.build();
private static final AspectDefinition ASPECT_REQUIRING_PROVIDER_SETS_DEFINITION =
new AspectDefinition.Builder(ASPECT_REQUIRING_PROVIDER_SETS)