diff options
author | 2018-07-18 05:55:23 -0700 | |
---|---|---|
committer | 2018-07-18 05:56:59 -0700 | |
commit | 5fe7ed0f6ddb600e86c32b2a52c7f094418f1afb (patch) | |
tree | ddf1377c2b3be9d3d48ccf9a703d0c7888caf80a /src/main/java/com/google/devtools/build/lib/analysis | |
parent | a1a57a519d49fcbda35f3df0e68e04ba09db3362 (diff) |
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
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java | 2 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | 44 |
2 files changed, 31 insertions, 15 deletions
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 3d970bb7ee..e6dd22da7f 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 @@ public final class ConfiguredTargetFactory { 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 c16e95dd29..8dab6513fb 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 @@ public final class RuleContext extends TargetContext 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 @@ public final class RuleContext extends TargetContext @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 @@ public final class RuleContext extends TargetContext 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 @@ public final class RuleContext extends TargetContext 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 @@ public final class RuleContext extends TargetContext } 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 @@ public final class RuleContext extends TargetContext */ 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 @@ public final class RuleContext extends TargetContext 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 final class RuleContext extends TargetContext } public Rule getRule() { - return rule; + return target.getAssociatedRule(); } /** @@ -1757,13 +1773,13 @@ public final class RuleContext extends TargetContext */ 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 @@ public final class RuleContext extends TargetContext * 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( |