Allow aspects to adveritise providers they provide.
--
PiperOrigin-RevId: 146794883
MOS_MIGRATED_REVID=146794883
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 c3748fe..76d24e0 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
@@ -684,4 +684,29 @@
.containsExactly(
"aspect //a:a", "aspect //a:b", "aspect //a:c", "aspect //a:tool", "rule //a:x");
}
+
+ @Test
+ public void aspectTruthInAdvertisement() throws Exception {
+ reporter.removeHandler(failFastHandler); // expect errors
+ setRulesAvailableInTests(
+ new TestAspects.BaseRule(),
+ new TestAspects.SimpleRule(),
+ new TestAspects.FalseAdvertisementAspectRule());
+ pkg(
+ "a",
+ "simple(name = 's')",
+ "false_advertisement_aspect(name = 'x', deps = [':s'])"
+ );
+ try {
+ update("//a:x");
+ } catch (ViewCreationFailedException e) {
+ // expected.
+ }
+ assertContainsEvent(
+ "Aspect 'FalseAdvertisementAspect', applied to '//a:s',"
+ + " does not provide advertised provider 'RequiredProvider'");
+ assertContainsEvent(
+ "Aspect 'FalseAdvertisementAspect', applied to '//a:s',"
+ + " does not provide advertised provider 'advertised_provider'");
+ }
}
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 3a74a59..0566c43 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
@@ -61,6 +61,7 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -442,6 +443,33 @@
.build();
/**
+ * An aspect that advertises but fails to provide providers.
+ */
+ public static class FalseAdvertisementAspect extends NativeAspectClass
+ implements ConfiguredAspectFactory {
+
+ @Override
+ public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+ return FALSE_ADVERTISEMENT_DEFINITION;
+ }
+
+ @Override
+ public ConfiguredAspect create(ConfiguredTarget base, RuleContext context,
+ AspectParameters parameters) throws InterruptedException {
+ return new ConfiguredAspect.Builder(this, parameters, context).build();
+ }
+ }
+ public static final FalseAdvertisementAspect FALSE_ADVERTISEMENT_ASPECT
+ = new FalseAdvertisementAspect();
+ private static final AspectDefinition FALSE_ADVERTISEMENT_DEFINITION =
+ new AspectDefinition.Builder(FALSE_ADVERTISEMENT_ASPECT)
+ .advertiseProvider(RequiredProvider.class)
+ .advertiseProvider(
+ ImmutableList.of(SkylarkProviderIdentifier.forLegacy("advertised_provider")))
+ .build();
+
+
+ /**
* A common base rule for mock rules in this class to reduce boilerplate.
*
* <p>It has a few common attributes because internal Blaze machinery assumes the presence of
@@ -967,6 +995,28 @@
}
/**
+ * Rule with {@link FalseAdvertisementAspect}
+ */
+ public static final class FalseAdvertisementAspectRule implements RuleDefinition {
+
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(attr("deps", LABEL_LIST).allowedFileTypes().aspect(FALSE_ADVERTISEMENT_ASPECT))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("false_advertisement_aspect")
+ .factoryClass(DummyRuleFactory.class)
+ .ancestors(BaseRule.class)
+ .build();
+ }
+ }
+
+ /**
* Rule with rule class configuration transition.
*/
public static class RuleClassTransitionRule implements RuleDefinition {