A prototype implementation of top-level aspects.

--
MOS_MIGRATED_REVID=101033236
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index fbe4140..43ec616 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -83,6 +83,7 @@
 import com.google.devtools.build.lib.rules.test.TestActionContext;
 import com.google.devtools.build.lib.runtime.BlazeModule;
 import com.google.devtools.build.lib.runtime.BlazeRuntime;
+import com.google.devtools.build.lib.skyframe.AspectValue;
 import com.google.devtools.build.lib.skyframe.Builder;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.syntax.Label;
@@ -391,12 +392,20 @@
     Set<ConfiguredTarget> builtTargets = new HashSet<>();
     boolean interrupted = false;
     try {
-      Iterable<Artifact> allArtifactsForProviders = Iterables.concat(
-          additionalArtifacts,
-          TopLevelArtifactHelper.getAllArtifactsToBuild(
-              analysisResult.getTargetsToBuild(), analysisResult.getTopLevelContext())
-              .getAllArtifacts(),
-          TopLevelArtifactHelper.getAllArtifactsToTest(analysisResult.getTargetsToTest()));
+      Collection<AspectValue> aspects = analysisResult.getAspects();
+
+      Iterable<Artifact> allArtifactsForProviders =
+          Iterables.concat(
+              additionalArtifacts,
+              TopLevelArtifactHelper.getAllArtifactsToBuild(
+                      analysisResult.getTargetsToBuild(), analysisResult.getTopLevelContext())
+                  .getAllArtifacts(),
+              TopLevelArtifactHelper.getAllArtifactsToBuildFromAspects(
+                      aspects, analysisResult.getTopLevelContext())
+                  .getAllArtifacts(),
+              //TODO(dslomov): Artifacts to test from aspects?
+              TopLevelArtifactHelper.getAllArtifactsToTest(analysisResult.getTargetsToTest()));
+
       if (request.isRunningInEmacs()) {
         // The syntax of this message is tightly constrained by lisp/progmodes/compile.el in emacs
         request.getOutErr().printErrLn("blaze: Entering directory `" + getExecRoot() + "/'");
@@ -422,11 +431,14 @@
 
       Profiler.instance().markPhase(ProfilePhase.EXECUTE);
 
-      builder.buildArtifacts(additionalArtifacts,
+      builder.buildArtifacts(
+          additionalArtifacts,
           analysisResult.getParallelTests(),
           analysisResult.getExclusiveTests(),
           analysisResult.getTargetsToBuild(),
-          executor, builtTargets,
+          analysisResult.getAspects(),
+          executor,
+          builtTargets,
           request.getBuildOptions().explanationPath != null,
           runtime.getLastExecutionTimeRange());
 
@@ -711,8 +723,8 @@
         }
       }
       if (headerFlag) {
-        outErr.printErr(
-            "Target " + label + " up-to-date (nothing to build)\n");
+        outErr.printErr("Here we are\n");
+        outErr.printErr("Target " + label + " up-to-date (nothing to build)\n");
       }
     }