When applying an aspect to a generated file of a Fileset avoid creating the FilesetEntryMap for the aspect's RuleContext.
The current logic in createFilesetEntryMap() uses the rule of the RuleContext.Builder to determine whether to create a filesetEntryMap or not, because of this, applying an aspect to a generated file of a fileset (e.g. 'out' attribute of a Fileset) causes createFilesetEntryMap to create the map even though the associated target is, for instance, a generated file. As a consequence, applying any aspect to a generated file of a fileset causes a NullPointerException.
PiperOrigin-RevId: 205065778
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 3d970bb..e6dd22d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -390,7 +390,7 @@
RuleContext.Builder builder =
new RuleContext.Builder(
env,
- associatedTarget.getTarget().getAssociatedRule(),
+ associatedTarget.getTarget(),
aspectPath,
aspectConfiguration,
hostConfiguration,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index c16e95d..8dab651 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -201,9 +201,13 @@
ImmutableMap<String, Attribute> aspectAttributes,
@Nullable ToolchainContext toolchainContext,
ConstraintSemantics constraintSemantics) {
- super(builder.env, builder.rule, builder.configuration, builder.prerequisiteMap.get(null),
+ super(
+ builder.env,
+ builder.target.getAssociatedRule(),
+ builder.configuration,
+ builder.prerequisiteMap.get(null),
builder.visibility);
- this.rule = builder.rule;
+ this.rule = builder.target.getAssociatedRule();
this.aspects = builder.aspects;
this.aspectDescriptors =
builder
@@ -1402,7 +1406,7 @@
@VisibleForTesting
public static final class Builder implements RuleErrorConsumer {
private final AnalysisEnvironment env;
- private final Rule rule;
+ private final Target target;
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
private ImmutableList<Class<? extends BuildConfiguration.Fragment>> universalFragments;
private final BuildConfiguration configuration;
@@ -1416,24 +1420,25 @@
private ImmutableList<Aspect> aspects;
private ToolchainContext toolchainContext;
private ConstraintSemantics constraintSemantics;
+ private ConfiguredTargetAndData associatedTarget;
@VisibleForTesting
public Builder(
AnalysisEnvironment env,
- Rule rule,
+ Target target,
ImmutableList<Aspect> aspects,
BuildConfiguration configuration,
BuildConfiguration hostConfiguration,
PrerequisiteValidator prerequisiteValidator,
ConfigurationFragmentPolicy configurationFragmentPolicy) {
this.env = Preconditions.checkNotNull(env);
- this.rule = Preconditions.checkNotNull(rule);
+ this.target = Preconditions.checkNotNull(target);
this.aspects = aspects;
this.configurationFragmentPolicy = Preconditions.checkNotNull(configurationFragmentPolicy);
this.configuration = Preconditions.checkNotNull(configuration);
this.hostConfiguration = Preconditions.checkNotNull(hostConfiguration);
this.prerequisiteValidator = prerequisiteValidator;
- reporter = new ErrorReporter(env, rule, getRuleClassNameForLogging());
+ reporter = new ErrorReporter(env, target.getAssociatedRule(), getRuleClassNameForLogging());
}
@VisibleForTesting
@@ -1442,11 +1447,12 @@
Preconditions.checkNotNull(configConditions);
Preconditions.checkNotNull(visibility);
Preconditions.checkNotNull(constraintSemantics);
- AttributeMap attributes = ConfiguredAttributeMapper.of(rule, configConditions);
+ AttributeMap attributes =
+ ConfiguredAttributeMapper.of(target.getAssociatedRule(), configConditions);
validateAttributes(attributes);
ListMultimap<String, ConfiguredTargetAndData> targetMap = createTargetMap();
ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap =
- createFilesetEntryMap(rule, configConditions);
+ createFilesetEntryMap(target.getAssociatedRule(), configConditions);
return new RuleContext(
this,
attributes,
@@ -1461,7 +1467,10 @@
}
private void validateAttributes(AttributeMap attributes) {
- rule.getRuleClassObject().checkAttributesNonEmpty(rule, reporter, attributes);
+ target
+ .getAssociatedRule()
+ .getRuleClassObject()
+ .checkAttributesNonEmpty(target.getAssociatedRule(), reporter, attributes);
}
public Builder setVisibility(NestedSet<PackageGroupContents> visibility) {
@@ -1552,6 +1561,10 @@
*/
private ListMultimap<String, ConfiguredFilesetEntry> createFilesetEntryMap(
final Rule rule, ImmutableMap<Label, ConfigMatchingProvider> configConditions) {
+ if (!target.getTargetKind().equals("Fileset rule")) {
+ return ImmutableSortedKeyListMultimap.<String, ConfiguredFilesetEntry>builder().build();
+ }
+
final ImmutableSortedKeyListMultimap.Builder<String, ConfiguredFilesetEntry> mapBuilder =
ImmutableSortedKeyListMultimap.builder();
for (Attribute attr : rule.getAttributes()) {
@@ -1708,7 +1721,10 @@
if (prerequisiteTarget instanceof Rule) {
Rule prerequisiteRule = (Rule) prerequisiteTarget;
- String reason = attribute.getValidityPredicate().checkValid(rule, prerequisiteRule);
+ String reason =
+ attribute
+ .getValidityPredicate()
+ .checkValid(target.getAssociatedRule(), prerequisiteRule);
if (reason != null) {
reportBadPrerequisite(attribute, prerequisite, reason, false);
}
@@ -1749,7 +1765,7 @@
}
public Rule getRule() {
- return rule;
+ return target.getAssociatedRule();
}
/**
@@ -1757,13 +1773,13 @@
*/
public String getRuleClassNameForLogging() {
if (aspects.isEmpty()) {
- return rule.getRuleClass();
+ return target.getAssociatedRule().getRuleClass();
}
return Joiner.on(",")
.join(aspects.stream().map(a -> a.getDescriptor()).collect(Collectors.toList()))
+ " aspect on "
- + rule.getRuleClass();
+ + target.getAssociatedRule().getRuleClass();
}
public BuildConfiguration getConfiguration() {
@@ -1779,7 +1795,7 @@
* method to determine whether a dependency is allowed as per visibility rules.
*/
public boolean isVisible(TransitiveInfoCollection prerequisite) {
- return RuleContext.isVisible(rule, prerequisite);
+ return RuleContext.isVisible(target.getAssociatedRule(), prerequisite);
}
private void validateDirectPrerequisiteFileTypes(