Rephrase the ActionGraph in terms of the WalkableGraph. This should be more efficient if we need to do many ActionGraph looups.

--
MOS_MIGRATED_REVID=100060090
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 d150986..42fe145 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
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.actions.ActionGraph;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
+import com.google.devtools.build.lib.actions.ArtifactOwner;
 import com.google.devtools.build.lib.actions.PackageRootResolver;
 import com.google.devtools.build.lib.actions.Root;
 import com.google.devtools.build.lib.analysis.DependencyResolver.Dependency;
@@ -63,15 +64,18 @@
 import com.google.devtools.build.lib.pkgcache.PackageManager;
 import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory;
 import com.google.devtools.build.lib.rules.test.CoverageReportActionFactory.CoverageReportActionsWrapper;
+import com.google.devtools.build.lib.skyframe.ActionLookupValue;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.CoverageReportValue;
 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.syntax.Label;
+import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.util.RegexFilter;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.WalkableGraph;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionsBase;
 
@@ -600,9 +604,12 @@
     prepareToBuild(new SkyframePackageRootResolver(skyframeExecutor));
     skyframeExecutor.injectWorkspaceStatusData();
     Collection<ConfiguredTarget> configuredTargets;
+    WalkableGraph graph;
     try {
-      configuredTargets = skyframeBuildView.configureTargets(
-          targetSpecs, eventBus, viewOptions.keepGoing);
+      Pair<Collection<ConfiguredTarget>, WalkableGraph> configuredTargetsResult =
+          skyframeBuildView.configureTargets(targetSpecs, eventBus, viewOptions.keepGoing);
+      configuredTargets = configuredTargetsResult.getFirst();
+      graph = configuredTargetsResult.getSecond();
     } finally {
       skyframeBuildView.clearInvalidatedConfiguredTargets();
     }
@@ -618,14 +625,15 @@
     }
 
     AnalysisResult result = createResult(loadingResult, topLevelOptions,
-        viewOptions, configuredTargets, analysisSuccessful);
+        viewOptions, configuredTargets, analysisSuccessful, graph);
     LOG.info("Finished analysis");
     return result;
   }
 
   private AnalysisResult createResult(LoadingResult loadingResult,
       TopLevelArtifactContext topLevelOptions, BuildView.Options viewOptions,
-      Collection<ConfiguredTarget> configuredTargets, boolean analysisSuccessful)
+      Collection<ConfiguredTarget> configuredTargets, boolean analysisSuccessful,
+      final WalkableGraph graph)
           throws InterruptedException {
     Collection<Target> testsToRun = loadingResult.getTestsToRun();
     Collection<ConfiguredTarget> allTargetsToTest = null;
@@ -666,7 +674,21 @@
             ? null
             : "execution phase succeeded, but not all targets were analyzed")
           : "execution phase succeeded, but there were loading phase errors";
-    return new AnalysisResult(configuredTargets, allTargetsToTest, error, getActionGraph(),
+
+    final ActionGraph actionGraph = new ActionGraph() {
+      @Nullable
+      @Override
+      public Action getGeneratingAction(Artifact artifact) {
+        ArtifactOwner artifactOwner = artifact.getArtifactOwner();
+        if (artifactOwner instanceof ActionLookupValue.ActionLookupKey) {
+          SkyKey key = ActionLookupValue.key((ActionLookupValue.ActionLookupKey) artifactOwner);
+          ActionLookupValue val = (ActionLookupValue) graph.getValue(key);
+          return val == null ? null : val.getGeneratingAction(artifact);
+        }
+        return null;
+      }
+    };
+    return new AnalysisResult(configuredTargets, allTargetsToTest, error, actionGraph,
         artifactsToBuild, parallelTests, exclusiveTests, topLevelOptions);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
index 4d51cfe..37e0e49 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java
@@ -57,7 +57,7 @@
     this.generatingActionMap = ImmutableMap.copyOf(generatingActionMap);
   }
 
-  Action getGeneratingAction(Artifact artifact) {
+  public Action getGeneratingAction(Artifact artifact) {
     return generatingActionMap.get(artifact);
   }
 
@@ -87,7 +87,7 @@
    *
    * <p>The methods of this class should only be called by {@link ActionLookupValue#key}.
    */
-  protected abstract static class ActionLookupKey implements ArtifactOwner {
+  public abstract static class ActionLookupKey implements ArtifactOwner {
     @Override
     public Label getLabel() {
       return null;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index fbae0e5..3ccc363 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -52,6 +52,7 @@
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException;
 import com.google.devtools.build.lib.syntax.Label;
+import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.CycleInfo;
 import com.google.devtools.build.skyframe.ErrorInfo;
@@ -60,6 +61,7 @@
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
+import com.google.devtools.build.skyframe.WalkableGraph;
 
 import java.util.Collection;
 import java.util.HashSet;
@@ -156,10 +158,10 @@
   /**
    * Analyzes the specified targets using Skyframe as the driving framework.
    *
-   * @return the configured targets that should be built
+   * @return the configured targets that should be built along with a WalkableGraph of the analysis.
    */
-  public Collection<ConfiguredTarget> configureTargets(List<ConfiguredTargetKey> values,
-      EventBus eventBus, boolean keepGoing)
+  public Pair<Collection<ConfiguredTarget>, WalkableGraph> configureTargets(
+      List<ConfiguredTargetKey> values, EventBus eventBus, boolean keepGoing)
           throws InterruptedException, ViewCreationFailedException {
     enableAnalysis(true);
     EvaluationResult<ConfiguredTargetValue> result;
@@ -184,7 +186,7 @@
 
     if (!result.hasError() && badActions.isEmpty()) {
       setDeserializedArtifactOwners();
-      return goodCts;
+      return Pair.of(goodCts, result.getWalkableGraph());
     }
 
     // --nokeep_going so we fail with an exception for the first error.
@@ -289,7 +291,7 @@
       }
     }
     setDeserializedArtifactOwners();
-    return goodCts;
+    return Pair.of(goodCts, result.getWalkableGraph());
   }
 
   @Nullable