Automated rollback of commit 9a00c789ea46dcb8c73e513ad1ba234a8417fff3.

*** Reason for rollback ***

Added fix for unconfigured dependencies causing analysis failure.

PiperOrigin-RevId: 310361242
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisFailureEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisFailureEvent.java
index ea0e769..02c37bf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisFailureEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisFailureEvent.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent;
@@ -51,6 +52,15 @@
     this.rootCauses = rootCauses;
   }
 
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this)
+        .add("failedTarget", failedTarget)
+        .add("configuration", configuration)
+        .add("legacyFailureReason", getLegacyFailureReason())
+        .toString();
+  }
+
   public ConfiguredTargetKey getFailedTarget() {
     return failedTarget;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
index 8556f82..7be2f31 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisRootCauseEvent.java
@@ -25,7 +25,9 @@
 import com.google.devtools.build.lib.buildeventstream.BuildEventWithConfiguration;
 import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
 import com.google.devtools.build.lib.cmdline.Label;
+import java.util.ArrayList;
 import java.util.Collection;
+import javax.annotation.Nullable;
 
 /**
  * Error message of an analysis root cause. This is separate from {@link AnalysisFailureEvent} to
@@ -38,7 +40,7 @@
   private final String errorMessage;
 
   public AnalysisRootCauseEvent(
-      BuildConfiguration configuration, Label label, String errorMessage) {
+      @Nullable BuildConfiguration configuration, Label label, String errorMessage) {
     this.configuration = configuration;
     this.label = label;
     this.errorMessage = errorMessage;
@@ -76,6 +78,12 @@
 
   @Override
   public Collection<BuildEvent> getConfigurations() {
-    return ImmutableList.<BuildEvent>of(configuration.toBuildEvent());
+    ArrayList<BuildEvent> result = new ArrayList<>();
+    if (configuration == null) {
+      result.add(null);
+    } else {
+      result.add(configuration.toBuildEvent());
+    }
+    return result;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
index 0958ed4..47c7131 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java
@@ -261,7 +261,7 @@
       throw new IllegalStateException(target.getLabel().toString());
     }
 
-    Map<Label, Target> targetMap = getTargets(outgoingLabels, target, rootCauses);
+    Map<Label, Target> targetMap = getTargets(outgoingLabels, node, rootCauses);
     if (targetMap == null) {
       // Dependencies could not be resolved. Try again when they are loaded by Skyframe.
       return OrderedSetMultimap.create();
@@ -713,8 +713,7 @@
    */
   protected abstract Map<Label, Target> getTargets(
       OrderedSetMultimap<DependencyKind, Label> labelMap,
-      Target fromTarget,
+      TargetAndConfiguration fromNode,
       NestedSetBuilder<Cause> rootCauses)
       throws InterruptedException;
-
 }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
index c8dd51b..5cf5207 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java
@@ -125,7 +125,7 @@
         // DependencyResolver but passing to avoid passing a null and since we have the information
         // anyway.
         deps =
-            new FormatterDependencyResolver(eventHandler)
+            new FormatterDependencyResolver()
                 .dependentNodeMap(
                     new TargetAndConfiguration(target, config),
                     hostConfiguration,
@@ -201,16 +201,11 @@
   }
 
   private class FormatterDependencyResolver extends DependencyResolver {
-    private final ExtendedEventHandler eventHandler;
-
-    private FormatterDependencyResolver(ExtendedEventHandler eventHandler) {
-      this.eventHandler = eventHandler;
-    }
 
     @Override
     protected Map<Label, Target> getTargets(
         OrderedSetMultimap<DependencyKind, Label> labelMap,
-        Target fromTarget,
+        TargetAndConfiguration fromNode,
         NestedSetBuilder<Cause> rootCauses) {
       return labelMap.values().stream()
           .distinct()
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index f8e96c0..70772d6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -309,14 +309,14 @@
               transitivePackagesForPackageRootResolution,
               transitiveRootCauses,
               defaultBuildOptions);
-      if (env.valuesMissing()) {
-        return null;
-      }
       if (!transitiveRootCauses.isEmpty()) {
         throw new ConfiguredTargetFunctionException(
             new ConfiguredValueCreationException(
                 "Analysis failed", configuration, transitiveRootCauses.build()));
       }
+      if (env.valuesMissing()) {
+        return null;
+      }
       Preconditions.checkNotNull(depValueMap);
 
       // Load the requested toolchains into the ToolchainContext, now that we have dependencies.
@@ -614,7 +614,6 @@
       env.getListener().handle(Event.error(e.getLocation(), e.getMessage()));
       throw new DependencyEvaluationException(e);
     }
-
     // Trim each dep's configuration so it only includes the fragments needed by its transitive
     // closure.
     depValueNames =
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 98bc456..12e5595 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
@@ -57,7 +57,9 @@
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
 import com.google.devtools.build.lib.bugreport.BugReport;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.ConfigurationId;
 import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
+import com.google.devtools.build.lib.causes.AnalysisFailedCause;
 import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.causes.LabelCause;
 import com.google.devtools.build.lib.causes.LoadingFailedCause;
@@ -716,6 +718,15 @@
         ((ActionConflictException) cause).reportTo(eventHandler);
         // TODO(ulfjack): Report the action conflict.
         rootCauses = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+      } else if (cause instanceof NoSuchPackageException) {
+        // This branch is only taken in --nokeep_going builds. In a --keep_going build, the
+        // AnalysisFailedCause is properly reported through the ConfiguredValueCreationException.
+        BuildConfiguration configuration =
+            configurationLookupSupplier.get().get(label.getConfigurationKey());
+        ConfigurationId configId = configuration.getEventId().getConfiguration();
+        AnalysisFailedCause analysisFailedCause =
+            new AnalysisFailedCause(topLevelLabel, configId, cause.getMessage());
+        rootCauses = NestedSetBuilder.create(Order.STABLE_ORDER, analysisFailedCause);
       } else {
         // TODO(ulfjack): Report something!
         rootCauses = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
index a487fa8..e39da2e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeDependencyResolver.java
@@ -16,9 +16,13 @@
 import static com.google.devtools.build.lib.cmdline.LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER;
 
 import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.analysis.AnalysisRootCauseEvent;
 import com.google.devtools.build.lib.analysis.DependencyKind;
 import com.google.devtools.build.lib.analysis.DependencyResolver;
 import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.ConfigurationId;
+import com.google.devtools.build.lib.causes.AnalysisFailedCause;
 import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.causes.LoadingFailedCause;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -84,10 +88,9 @@
   @Override
   protected Map<Label, Target> getTargets(
       OrderedSetMultimap<DependencyKind, Label> labelMap,
-      Target fromTarget,
+      TargetAndConfiguration fromNode,
       NestedSetBuilder<Cause> rootCauses)
       throws InterruptedException {
-
     Map<PackageIdentifier, SkyKey> packageKeys = new HashMap<>(labelMap.size());
     for (Label label : labelMap.values()) {
       packageKeys.computeIfAbsent(label.getPackageIdentifier(), id -> PackageValue.key(id));
@@ -96,6 +99,8 @@
     Map<SkyKey, ValueOrException<NoSuchPackageException>> packages =
         env.getValuesOrThrow(packageKeys.values(), NoSuchPackageException.class);
 
+    Target fromTarget = fromNode.getTarget();
+
     // As per the comment in SkyFunctionEnvironment.getValueOrUntypedExceptions(), we are supposed
     // to prefer reporting errors to reporting null, we first check for errors in our dependencies.
     // This, of course, results in some wasted work in case this will need to be restarted later.
@@ -144,7 +149,13 @@
                           e.getMessage())));
           continue;
         }
-        rootCauses.add(new LoadingFailedCause(label, e.getMessage()));
+        @Nullable BuildConfiguration configuration = fromNode.getConfiguration();
+        @Nullable ConfigurationId configId = null;
+        if (configuration != null) {
+          configId =  configuration.getEventId().getConfiguration();
+        }
+        env.getListener().post(new AnalysisRootCauseEvent(configuration, label, e.getMessage()));
+        rootCauses.add(new AnalysisFailedCause(label, configId, e.getMessage()));
         missingEdgeHook(fromTarget, entry.getKey(), label, e);
         continue;
       }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureReportingTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureReportingTest.java
index 9df3820..6a06f42 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureReportingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisFailureReportingTest.java
@@ -90,8 +90,11 @@
     assertThat(collector.events.keySet()).containsExactly(topLevel);
     assertThat(collector.events.get(topLevel))
         .containsExactly(
-            new LoadingFailedCause(
+            new AnalysisFailedCause(
                 causeLabel,
+                toId(
+                    Iterables.getOnlyElement(result.getTopLevelTargetsWithConfigs())
+                        .getConfiguration()),
                 "no such package 'bar': BUILD file not found in any of the following "
                     + "directories. Add a BUILD file to a directory to mark it as a package.\n"
                     + " - /workspace/bar"));
@@ -123,8 +126,11 @@
     Label topLevel = Label.parseAbsoluteUnchecked("//gp");
     assertThat(collector.events.get(topLevel))
         .containsExactly(
-            new LoadingFailedCause(
+            new AnalysisFailedCause(
                 Label.parseAbsolute("//cycles1", ImmutableMap.of()),
+                toId(
+                    Iterables.getOnlyElement(result.getTopLevelTargetsWithConfigs())
+                        .getConfiguration()),
                 "no such package 'cycles1': Symlink issue while evaluating globs: Symlink cycle: "
                     + "/workspace/cycles1/cycles1.sh"));
   }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index 8758dc7..854786a 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -40,6 +40,8 @@
 import com.google.devtools.build.lib.analysis.util.ExpectedTrimmedConfigurationErrors;
 import com.google.devtools.build.lib.analysis.util.MockRule;
 import com.google.devtools.build.lib.buildeventstream.NullConfiguration;
+import com.google.devtools.build.lib.causes.AnalysisFailedCause;
+import com.google.devtools.build.lib.causes.Cause;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.OutputFilter.RegexOutputFilter;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -63,6 +65,7 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -216,7 +219,7 @@
   }
 
   @Test
-  public void testReportsAnalysisRootCauses() throws Exception {
+  public void testReportsVisibilityAnalysisRootCauses() throws Exception {
     scratch.file("private/BUILD",
         "genrule(",
         "    name='private',",
@@ -252,6 +255,129 @@
   }
 
   @Test
+  public void testReportsNonExistentPackageAnalysisRootCausesNoKeepGoing() throws Exception {
+    if (defaultFlags().contains(Flag.TRIMMED_CONFIGURATIONS)) {
+      // TODO(b/129599328): fix or justify disabling
+      return;
+    }
+    // Regression test for b/153480748, content taken from:
+    // //devtools/builddoctor/projects/invalid/java/library_invalid_dep/BUILD#2
+    scratch.file(
+        "java/BUILD",
+        "java_library(",
+        "    name='library_invalid_dep',",
+        "    srcs=['NoOp.java'],",
+        "    deps=['//non/existent/package:target'])",
+        "java_library(",
+        "    name='other',",
+        "    srcs=['NoOp.java'],",
+        "    deps=[])");
+    scratch.file("java/NoOp.java", "class NoOp { private NoOp() {} }");
+
+    reporter.removeHandler(failFastHandler);
+    AnalysisFailureRecorder recorder = new AnalysisFailureRecorder();
+    eventBus.register(recorder);
+    ViewCreationFailedException e =
+        assertThrows(
+            ViewCreationFailedException.class,
+            () -> update(eventBus, defaultFlags(), "//java:library_invalid_dep"));
+    assertThat(e)
+        .hasMessageThat()
+        .contains("Analysis of target '//java:library_invalid_dep' failed; build aborted");
+
+    assertThat(recorder.events).hasSize(1);
+    AnalysisFailureEvent event = recorder.events.get(0);
+    assertThat(event.getLegacyFailureReason().toString())
+        .isEqualTo("//non/existent/package:target");
+    assertThat(event.getFailedTarget().getLabel().toString())
+        .isEqualTo("//java:library_invalid_dep");
+
+    assertThat(recorder.causes).hasSize(1);
+    AnalysisRootCauseEvent cause = recorder.causes.get(0);
+    assertThat(cause.getLabel().toString()).isEqualTo("//non/existent/package:target");
+  }
+
+  @Test
+  public void testReportsNonExistentPackageAnalysisRootCausesKeepGoing() throws Exception {
+    if (defaultFlags().contains(Flag.TRIMMED_CONFIGURATIONS)) {
+      // TODO(b/129599328): fix or justify disabling
+      return;
+    }
+    // Regression test for b/153480748, content taken from:
+    // //devtools/builddoctor/projects/invalid/java/library_invalid_dep/BUILD#2
+    scratch.file(
+        "java/BUILD",
+        "java_library(",
+        "    name='library_invalid_dep',",
+        "    srcs=['NoOp.java'],",
+        "    deps=['//non/existent/package:target'])",
+        "java_library(",
+        "    name='other',",
+        "    srcs=['NoOp.java'],",
+        "    deps=[])");
+    scratch.file("java/NoOp.java", "class NoOp { private NoOp() {} }");
+
+    reporter.removeHandler(failFastHandler);
+    AnalysisFailureRecorder recorder = new AnalysisFailureRecorder();
+    eventBus.register(recorder);
+    AnalysisResult result =
+        update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//java:library_invalid_dep");
+    assertThat(result.hasError()).isTrue();
+
+    assertThat(recorder.events).hasSize(1);
+    AnalysisFailureEvent event = recorder.events.get(0);
+    assertThat(event.getLegacyFailureReason().toString())
+        .isEqualTo("//non/existent/package:target");
+    assertThat(event.getFailedTarget().getLabel().toString())
+        .isEqualTo("//java:library_invalid_dep");
+
+    assertThat(recorder.causes).hasSize(1);
+    AnalysisRootCauseEvent cause = recorder.causes.get(0);
+    assertThat(cause.getLabel().toString()).isEqualTo("//non/existent/package:target");
+  }
+
+  @Test
+  public void testReportsNonExistentPackageInPackageGroupKeepGoing()
+      throws Exception {
+    if (defaultFlags().contains(Flag.TRIMMED_CONFIGURATIONS)) {
+      // TODO(b/129599328): fix or justify disabling
+      return;
+    }
+    // Regression test for b/155669924, a missed edge case from the fix to b/153480748.
+    scratch.file(
+        "java/BUILD",
+        "package_group(name = 'group', includes=['//non/existent/package:othergroup'])",
+        "java_library(",
+        "    name='library_invalid_visibility',",
+        "    srcs=['NoOp.java'],",
+        "    deps=[':other'],",
+        "    visibility=[':group'])",
+        "java_library(",
+        "    name='other',",
+        "    srcs=['NoOp.java'],",
+        "    deps=[])");
+    scratch.file("java/NoOp.java", "class NoOp { private NoOp() {} }");
+
+    reporter.removeHandler(failFastHandler);
+    AnalysisFailureRecorder recorder = new AnalysisFailureRecorder();
+    eventBus.register(recorder);
+    AnalysisResult result =
+        update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//java:library_invalid_visibility");
+    assertThat(result.hasError()).isTrue();
+
+    assertThat(recorder.events).hasSize(1);
+    AnalysisFailureEvent event = recorder.events.get(0);
+    assertThat(event.getLegacyFailureReason().toString())
+        .isEqualTo("//non/existent/package:othergroup");
+    assertThat(event.getFailedTarget().getLabel().toString())
+        .isEqualTo("//java:library_invalid_visibility");
+
+    assertThat(recorder.causes).hasSize(1);
+    AnalysisRootCauseEvent cause = recorder.causes.get(0);
+    assertThat(cause.getLabel().toString()).isEqualTo("//non/existent/package:othergroup");
+  }
+
+  @Test
   public void testTestOnlyFailureReported() throws Exception {
     scratch.file(
         "foo/BUILD",
@@ -308,22 +434,29 @@
         "        cmd='')");
 
     reporter.removeHandler(failFastHandler);
-    LoadingFailureRecorder recorder = new LoadingFailureRecorder();
-    eventBus.register(recorder);
-    // Note: no need to run analysis for a loading failure.
+    LoadingFailureRecorder loadingRecorder = new LoadingFailureRecorder();
+    AnalysisFailureRecorder analysisRecorder = new AnalysisFailureRecorder();
+    eventBus.register(loadingRecorder);
+    eventBus.register(analysisRecorder);
     AnalysisResult result = update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//pkg:foo");
     assertThat(result.hasError()).isTrue();
-    assertThat(recorder.events)
-        .contains(
-            new LoadingFailureEvent(
-                Label.parseAbsolute("//pkg:foo", ImmutableMap.of()),
-                Label.parseAbsolute("//nopackage:missing", ImmutableMap.of())));
+
+    assertThat(analysisRecorder.events).hasSize(1);
+    AnalysisFailureEvent analysisFailureEvent = analysisRecorder.events.get(0);
+    assertThat(analysisFailureEvent.getFailedTarget().getLabel().toString()).isEqualTo("//pkg:foo");
+    ImmutableList<Cause> analysisFailureCauses = analysisFailureEvent.getRootCauses().toList();
+    Cause missingPackageCause =
+        analysisFailureCauses.get(0) instanceof AnalysisFailedCause
+            ? analysisFailureCauses.get(0)
+            : analysisFailureCauses.get(1);
+    assertThat(missingPackageCause.getLabel())
+        .isEqualTo(Label.parseAbsolute("//nopackage:missing", ImmutableMap.of()));
     assertContainsEvent("missing value for mandatory attribute 'outs'");
     assertContainsEvent("no such package 'nopackage'");
     // Skyframe correctly reports the other root cause as the genrule itself (since it is
     // missing attributes).
-    assertThat(recorder.events).hasSize(2);
-    assertThat(recorder.events)
+    assertThat(loadingRecorder.events).hasSize(1);
+    assertThat(loadingRecorder.events)
         .contains(
             new LoadingFailureEvent(
                 Label.parseAbsolute("//pkg:foo", ImmutableMap.of()),
@@ -863,18 +996,18 @@
     cycles2BuildFilePath.getParentDirectory().getRelative("cycles2.sh").createSymbolicLink(
         PathFragment.create("cycles2.sh"));
     reporter.removeHandler(failFastHandler);
-    LoadingFailureRecorder recorder = new LoadingFailureRecorder();
+    AnalysisFailureRecorder recorder = new AnalysisFailureRecorder();
     eventBus.register(recorder);
     AnalysisResult result = update(eventBus, defaultFlags().with(Flag.KEEP_GOING), "//gp");
     assertThat(result.hasError()).isTrue();
-    assertThat(recorder.events)
+    AnalysisFailureEvent event = recorder.events.get(0);
+    assertThat(event.getFailedTarget().getLabel().toString()).isEqualTo("//gp:gp");
+    List<Label> rootCauseLabels =
+        event.getRootCauses().toList().stream().map(Cause::getLabel).collect(Collectors.toList());
+    assertThat(rootCauseLabels)
         .containsExactly(
-            new LoadingFailureEvent(
-                Label.parseAbsolute("//gp", ImmutableMap.of()),
-                Label.parseAbsolute("//cycles1", ImmutableMap.of())),
-            new LoadingFailureEvent(
-                Label.parseAbsolute("//gp", ImmutableMap.of()),
-                Label.parseAbsolute("//cycles2", ImmutableMap.of())));
+            Label.parseAbsolute("//cycles1", ImmutableMap.of()),
+            Label.parseAbsolute("//cycles2", ImmutableMap.of()));
   }
 
   /**
@@ -1053,8 +1186,7 @@
     reporter.removeHandler(failFastHandler);
     AnalysisResult result = update(defaultFlags().with(Flag.KEEP_GOING), "//a", "//b");
     assertThat(result.hasError()).isTrue();
-    assertThat(result.getError())
-        .contains("command succeeded, but there were loading phase errors");
+    assertThat(result.getError()).contains("command succeeded, but not all targets were analyzed");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index 912b28d..a29a806 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -60,7 +60,7 @@
           @Override
           protected Map<Label, Target> getTargets(
               OrderedSetMultimap<DependencyKind, Label> labelMap,
-              Target fromTarget,
+              TargetAndConfiguration fromNode,
               NestedSetBuilder<Cause> rootCauses) {
             return labelMap.values().stream()
                 .distinct()
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
index ed177e1..92fa670 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java
@@ -304,7 +304,7 @@
       @Override
       protected Map<Label, Target> getTargets(
           OrderedSetMultimap<DependencyKind, Label> labelMap,
-          Target fromTarget,
+          TargetAndConfiguration fromNode,
           NestedSetBuilder<Cause> rootCauses) {
         return labelMap.values().stream()
             .distinct()