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/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(