Fix aspect attributes targeting PackageGroup.
A NullPointerException occured on such attributes while aspect was visiting target rule, because target rule had no such attribute.
RELNOTES: None.
PiperOrigin-RevId: 315272194
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java b/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
index 31179bf..eeb7b5c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CommonPrerequisiteValidator.java
@@ -107,9 +107,12 @@
}
if (prerequisiteTarget instanceof PackageGroup) {
+ Attribute configuredAttribute = RawAttributeMapper.of(rule).getAttributeDefinition(attrName);
+ if (configuredAttribute == null) { // handles aspects
+ configuredAttribute = attribute;
+ }
boolean containsPackageSpecificationProvider =
- RawAttributeMapper.of(rule)
- .getAttributeDefinition(attrName)
+ configuredAttribute
.getRequiredProviders()
.getDescription()
.contains("PackageSpecificationProvider");
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 2df81ba..8760a00 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
@@ -327,6 +327,17 @@
}
@Test
+ public void aspectDependsOnPackageGroup() throws Exception {
+ setRulesAvailableInTests(
+ TestAspects.BASE_RULE, TestAspects.PACKAGE_GROUP_ATTRIBUTE_ASPECT_RULE);
+ pkg("extra", "package_group(name='extra')");
+ pkg("a", "rule_with_package_group_deps_aspect(name='a', foo=[':b'])", "base(name='b')");
+
+ getConfiguredTarget("//a:a");
+ assertContainsEventWithFrequency("bad aspect", 0);
+ }
+
+ @Test
public void aspectWithComputedAttribute() throws Exception {
setRulesAvailableInTests(TestAspects.BASE_RULE, TestAspects.COMPUTED_ATTRIBUTE_ASPECT_RULE);
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
index 709d697..b0520c6 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestCase.java
@@ -623,6 +623,7 @@
TestAspects.ALL_ATTRIBUTES_WITH_TOOL_ASPECT,
TestAspects.BAR_PROVIDER_ASPECT,
TestAspects.EXTRA_ATTRIBUTE_ASPECT,
+ TestAspects.PACKAGE_GROUP_ATTRIBUTE_ASPECT,
TestAspects.COMPUTED_ATTRIBUTE_ASPECT,
TestAspects.FOO_PROVIDER_ASPECT,
TestAspects.ASPECT_REQUIRING_PROVIDER_SETS,
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
index 3033a75..0723ee0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BUILD
@@ -63,6 +63,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:extra_action_artifacts_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:file_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:inconsistent_aspect_order_exception",
+ "//src/main/java/com/google/devtools/build/lib/analysis:package_specification_provider",
"//src/main/java/com/google/devtools/build/lib/analysis:resolved_toolchain_context",
"//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
"//src/main/java/com/google/devtools/build/lib/analysis:server_directories",
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 f324777..7fa346a 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
@@ -30,6 +30,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.PackageSpecificationProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.RuleContext;
@@ -338,6 +339,24 @@
}
}
+ /** An aspect that defines its own implicit attribute, requiring PackageSpecificationProvider. */
+ public static class PackageGroupAttributeAspect extends BaseAspect {
+ @Override
+ public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+ return PACKAGE_GROUP_ATTRIBUTE_ASPECT_DEFINITION;
+ }
+ }
+
+ public static final PackageGroupAttributeAspect PACKAGE_GROUP_ATTRIBUTE_ASPECT =
+ new PackageGroupAttributeAspect();
+ private static final AspectDefinition PACKAGE_GROUP_ATTRIBUTE_ASPECT_DEFINITION =
+ new AspectDefinition.Builder(PACKAGE_GROUP_ATTRIBUTE_ASPECT)
+ .add(
+ attr("$dep", LABEL)
+ .value(Label.parseAbsoluteUnchecked("//extra:extra"))
+ .mandatoryNativeProviders(ImmutableList.of(PackageSpecificationProvider.class)))
+ .build();
+
public static final ComputedAttributeAspect COMPUTED_ATTRIBUTE_ASPECT =
new ComputedAttributeAspect();
private static final AspectDefinition COMPUTED_ATTRIBUTE_ASPECT_DEFINITION =
@@ -674,6 +693,17 @@
attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
.aspect(EXTRA_ATTRIBUTE_ASPECT));
+ /** A rule that defines an {@link PackageGroupAttributeAspect} on one of its attributes. */
+ public static final MockRule PACKAGE_GROUP_ATTRIBUTE_ASPECT_RULE =
+ () ->
+ MockRule.ancestor(BASE_RULE.getClass())
+ .factory(DummyRuleFactory.class)
+ .define(
+ "rule_with_package_group_deps_aspect",
+ attr("foo", LABEL_LIST)
+ .allowedFileTypes(FileTypeSet.ANY_FILE)
+ .aspect(PACKAGE_GROUP_ATTRIBUTE_ASPECT));
+
/** A rule that defines an {@link ComputedAttributeAspect} on one of its attributes. */
public static final MockRule COMPUTED_ATTRIBUTE_ASPECT_RULE =
() ->