aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar lpino <lpino@google.com>2018-07-18 05:55:23 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-18 05:56:59 -0700
commit5fe7ed0f6ddb600e86c32b2a52c7f094418f1afb (patch)
treeddf1377c2b3be9d3d48ccf9a703d0c7888caf80a /src/main/java/com/google/devtools/build/lib/analysis
parenta1a57a519d49fcbda35f3df0e68e04ba09db3362 (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.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java44
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(