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;
       }