Apply extra actions to top-level aspects.

--
MOS_MIGRATED_REVID=129759632
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 1afacf9..dde2d06 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -72,6 +72,7 @@
 import com.google.devtools.build.lib.skyframe.SkyframeBuildView;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.lib.util.RegexFilter;
 import com.google.devtools.build.lib.vfs.Path;
@@ -517,6 +518,8 @@
           throws InterruptedException {
     Collection<Target> testsToRun = loadingResult.getTestsToRun();
     Collection<ConfiguredTarget> configuredTargets = skyframeAnalysisResult.getConfiguredTargets();
+    Collection<AspectValue> aspects = skyframeAnalysisResult.getAspects();
+
     Collection<ConfiguredTarget> allTargetsToTest = null;
     if (testsToRun != null) {
       // Determine the subset of configured targets that are meant to be run as tests.
@@ -537,7 +540,7 @@
     artifactsToBuild.addAll(buildInfoArtifacts);
 
     // Extra actions
-    addExtraActionsIfRequested(viewOptions, artifactsToBuild, configuredTargets);
+    addExtraActionsIfRequested(viewOptions, configuredTargets, aspects, artifactsToBuild);
 
     // Coverage
     NestedSet<Artifact> baselineCoverageArtifacts = getBaselineCoverageArtifacts(configuredTargets);
@@ -579,7 +582,7 @@
     };
     return new AnalysisResult(
         configuredTargets,
-        skyframeAnalysisResult.getAspects(),
+        aspects,
         allTargetsToTest,
         error,
         actionGraph,
@@ -616,15 +619,50 @@
     return baselineCoverageArtifacts.build();
   }
 
+  private void addExtraActionsIfRequested(Options viewOptions,
+      Collection<ConfiguredTarget> configuredTargets,
+      Collection<AspectValue> aspects,
+      Set<Artifact> artifactsToBuild) {
+    addExtraActionsIfRequested(viewOptions, artifactsToBuild,
+        Iterables.transform(configuredTargets,
+            new Function<ConfiguredTarget, Pair<Label, ExtraActionArtifactsProvider>>() {
+              @Nullable
+              @Override
+              public Pair<Label, ExtraActionArtifactsProvider> apply(
+                  ConfiguredTarget configuredTarget) {
+                return Pair.of(
+                    configuredTarget.getLabel(),
+                    configuredTarget.getProvider(ExtraActionArtifactsProvider.class));
+              }
+            }));
+    addExtraActionsIfRequested(viewOptions, artifactsToBuild,
+        Iterables.transform(aspects,
+            new Function<AspectValue, Pair<Label, ExtraActionArtifactsProvider>>() {
+              @Nullable
+              @Override
+              public Pair<Label, ExtraActionArtifactsProvider> apply(
+                  AspectValue aspectValue) {
+                return Pair.of(
+                    aspectValue.getLabel(),
+                    aspectValue
+                        .getConfiguredAspect()
+                        .getProvider(ExtraActionArtifactsProvider.class));
+              }
+            }
+        ));
+  }
+
   private void addExtraActionsIfRequested(BuildView.Options viewOptions,
-      Set<Artifact> artifactsToBuild, Iterable<ConfiguredTarget> topLevelTargets) {
+      Set<Artifact> artifactsToBuild,
+      Iterable<Pair<Label, ExtraActionArtifactsProvider>> providers) {
     NestedSetBuilder<ExtraArtifactSet> builder = NestedSetBuilder.stableOrder();
-    for (ConfiguredTarget topLevel : topLevelTargets) {
-      ExtraActionArtifactsProvider provider = topLevel.getProvider(
-          ExtraActionArtifactsProvider.class);
+    for (Pair<Label, ExtraActionArtifactsProvider> labelAndProvider : providers) {
+      ExtraActionArtifactsProvider provider = labelAndProvider.getSecond();
       if (provider != null) {
         if (viewOptions.extraActionTopLevelOnly) {
-          builder.add(ExtraArtifactSet.of(topLevel.getLabel(), provider.getExtraActionArtifacts()));
+          builder.add(ExtraArtifactSet.of(
+              labelAndProvider.getFirst(),
+              provider.getExtraActionArtifacts()));
         } else {
           builder.addTransitive(provider.getTransitiveExtraActionArtifacts());
         }