Remove ConfiguredTarget from TargetCompletionValue, since it is no longer needed: we can get the ConfiguredTargetKey directly from the TargetCompletionKey. Since that was the only use of the actual value in EvaluationProgressReceiver#evaluated, remove it, instead just provide a boolean enum that gives whether or not evaluation succeeded.

PiperOrigin-RevId: 199178047
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
index 644f34e..b0447fd 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
@@ -13,17 +13,14 @@
 // limitations under the License.
 package com.google.devtools.build.lib.buildtool;
 
-import com.google.common.base.Supplier;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.actions.Action;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
 import com.google.devtools.build.lib.actions.ActionExecutionStatusReporter;
 import com.google.devtools.build.lib.actions.ActionLookupData;
-import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.clock.BlazeClock;
 import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog;
 import com.google.devtools.build.lib.skyframe.AspectCompletionValue;
-import com.google.devtools.build.lib.skyframe.AspectCompletionValue.AspectCompletionKey;
 import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
@@ -32,12 +29,12 @@
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver;
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
 import java.text.NumberFormat;
 import java.util.Collections;
 import java.util.Locale;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
 
 /**
  * Listener for executed actions and built artifacts. We use a listener so that we have an
@@ -101,22 +98,20 @@
   }
 
   @Override
-  public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
+  public void evaluated(
+      SkyKey skyKey,
+      Supplier<EvaluationSuccessState> evaluationSuccessState,
+      EvaluationState state) {
     SkyFunctionName type = skyKey.functionName();
     if (type.equals(SkyFunctions.TARGET_COMPLETION)) {
-      TargetCompletionValue value = (TargetCompletionValue) skyValueSupplier.get();
-      if (value == null) {
-        return;
+      if (evaluationSuccessState.get().succeeded()) {
+        builtTargets.add(
+            ((TargetCompletionValue.TargetCompletionKey) skyKey).configuredTargetKey());
       }
-      ConfiguredTarget target = value.getConfiguredTarget();
-      builtTargets.add(ConfiguredTargetKey.inTargetConfig(target));
     } else if (type.equals(SkyFunctions.ASPECT_COMPLETION)) {
-      AspectCompletionValue value = (AspectCompletionValue) skyValueSupplier.get();
-      if (value == null) {
-        return;
+      if (evaluationSuccessState.get().succeeded()) {
+        builtAspects.add(((AspectCompletionValue.AspectCompletionKey) skyKey).aspectKey());
       }
-      AspectKey aspectKey = ((AspectCompletionKey) skyKey).aspectKey();
-      builtAspects.add(aspectKey);
     } else if (type.equals(SkyFunctions.ACTION_EXECUTION)) {
       // Remember all completed actions, even those in error, regardless of having been cached or
       // really executed.
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
index 83e8799..de70aa1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java
@@ -79,10 +79,8 @@
     MissingInputFileException getMissingFilesException(
         TValue value, int missingCount, Environment env) throws InterruptedException;
 
-    /**
-     * Creates a successful completion value.
-     */
-    TResult createResult(TValue value);
+    /** Provides a successful completion value. */
+    TResult getResult();
 
     /** Creates a failed completion value. */
     ExtendedEventHandler.Postable createFailed(
@@ -157,8 +155,8 @@
     }
 
     @Override
-    public TargetCompletionValue createResult(ConfiguredTargetValue value) {
-      return new TargetCompletionValue(value.getConfiguredTarget());
+    public TargetCompletionValue getResult() {
+      return TargetCompletionValue.INSTANCE;
     }
 
     @Override
@@ -251,7 +249,7 @@
     }
 
     @Override
-    public AspectCompletionValue createResult(AspectValue value) {
+    public AspectCompletionValue getResult() {
       return AspectCompletionValue.INSTANCE;
     }
 
@@ -369,7 +367,7 @@
       return null;
     }
     env.getListener().post(postable);
-    return completor.createResult(value);
+    return completor.getResult();
   }
 
   @Override
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 c4491ff..fefb8fb 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
@@ -15,7 +15,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -75,12 +74,12 @@
 import com.google.devtools.build.skyframe.EvaluationResult;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
 import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 
 /**
@@ -675,12 +674,14 @@
     }
 
     @Override
-    public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
+    public void evaluated(
+        SkyKey skyKey,
+        Supplier<EvaluationSuccessState> evaluationSuccessState,
         EvaluationState state) {
       if (skyKey.functionName().equals(SkyFunctions.CONFIGURED_TARGET)) {
         switch (state) {
           case BUILT:
-            if (skyValueSupplier.get() != null) {
+            if (evaluationSuccessState.get().succeeded()) {
               evaluatedConfiguredTargets.add(skyKey);
               // During multithreaded operation, this is only set to true, so no concurrency issues.
               someConfiguredTargetEvaluated = true;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index c424bd4..c0bb404 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -21,7 +21,6 @@
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.base.Stopwatch;
-import com.google.common.base.Supplier;
 import com.google.common.base.Throwables;
 import com.google.common.cache.Cache;
 import com.google.common.cache.CacheBuilder;
@@ -179,6 +178,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BooleanSupplier;
+import java.util.function.Supplier;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -1319,7 +1319,7 @@
     try {
       progressReceiver.executionProgressReceiver = executionProgressReceiver;
       Iterable<SkyKey> artifactKeys = ArtifactSkyKey.mandatoryKeys(artifactsToBuild);
-      Iterable<SkyKey> targetKeys =
+      Iterable<TargetCompletionValue.TargetCompletionKey> targetKeys =
           TargetCompletionValue.keys(targetsToBuild, topLevelArtifactContext, targetsToTest);
       Iterable<SkyKey> aspectKeys = AspectCompletionValue.keys(aspects, topLevelArtifactContext);
       Iterable<SkyKey> testKeys =
@@ -2320,13 +2320,16 @@
     }
 
     @Override
-    public void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state) {
+    public void evaluated(
+        SkyKey skyKey,
+        Supplier<EvaluationSuccessState> evaluationSuccessState,
+        EvaluationState state) {
       if (ignoreInvalidations) {
         return;
       }
-      skyframeBuildView.getProgressReceiver().evaluated(skyKey, valueSupplier, state);
+      skyframeBuildView.getProgressReceiver().evaluated(skyKey, evaluationSuccessState, state);
       if (executionProgressReceiver != null) {
-        executionProgressReceiver.evaluated(skyKey, valueSupplier, state);
+        executionProgressReceiver.evaluated(skyKey, evaluationSuccessState, state);
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java
index f15e6fb..dbbb6a7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java
@@ -28,24 +28,18 @@
  * The value of a TargetCompletion. Currently this just stores a ConfiguredTarget.
  */
 public class TargetCompletionValue implements SkyValue {
-  private final ConfiguredTarget ct;
+  @AutoCodec static final TargetCompletionValue INSTANCE = new TargetCompletionValue();
 
-  TargetCompletionValue(ConfiguredTarget ct) {
-    this.ct = ct;
-  }
+  private TargetCompletionValue() {}
 
-  public ConfiguredTarget getConfiguredTarget() {
-    return ct;
-  }
-
-  public static SkyKey key(
+  public static TargetCompletionKey key(
       ConfiguredTargetKey configuredTargetKey,
       TopLevelArtifactContext topLevelArtifactContext,
       boolean willTest) {
     return TargetCompletionKey.create(configuredTargetKey, topLevelArtifactContext, willTest);
   }
 
-  public static Iterable<SkyKey> keys(
+  public static Iterable<TargetCompletionKey> keys(
       Collection<ConfiguredTarget> targets,
       final TopLevelArtifactContext ctx,
       final Set<ConfiguredTarget> targetsToTest) {
@@ -63,7 +57,7 @@
   /** {@link SkyKey} for {@link TargetCompletionValue}. */
   @AutoCodec
   @AutoValue
-  abstract static class TargetCompletionKey implements SkyKey {
+  public abstract static class TargetCompletionKey implements SkyKey {
     @AutoCodec.Instantiator
     static TargetCompletionKey create(
         ConfiguredTargetKey configuredTargetKey,
@@ -78,9 +72,10 @@
       return SkyFunctions.TARGET_COMPLETION;
     }
 
-    abstract ConfiguredTargetKey configuredTargetKey();
+    public abstract ConfiguredTargetKey configuredTargetKey();
 
-    public abstract TopLevelArtifactContext topLevelArtifactContext();
-    public abstract boolean willTest();
+    abstract TopLevelArtifactContext topLevelArtifactContext();
+
+    abstract boolean willTest();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
index 43068fe..7771d83 100644
--- a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -25,6 +24,7 @@
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.util.GroupedList;
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState;
+import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationSuccessState;
 import com.google.devtools.build.skyframe.MemoizingEvaluator.EmittedEventState;
 import com.google.devtools.build.skyframe.NodeEntry.DependencyState;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
@@ -156,7 +156,9 @@
           .getProgressReceiver()
           .evaluated(
               key,
-              Suppliers.ofInstance(value),
+              value != null
+                  ? EvaluationSuccessState.SUCCESS.supplier()
+                  : EvaluationSuccessState.FAILURE.supplier(),
               valueVersion.equals(evaluatorContext.getGraphVersion())
                   ? EvaluationState.BUILT
                   : EvaluationState.CLEAN);
diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
index 5cb810f..2373959 100644
--- a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
@@ -286,7 +286,7 @@
           // Tell the receiver that the value was not actually changed this run.
           evaluatorContext
               .getProgressReceiver()
-              .evaluated(skyKey, new SkyValueSupplier(state), EvaluationState.CLEAN);
+              .evaluated(skyKey, new EvaluationSuccessStateSupplier(state), EvaluationState.CLEAN);
           if (!evaluatorContext.keepGoing() && state.getErrorInfo() != null) {
             if (!evaluatorContext.getVisitor().preventNewEvaluations()) {
               return DirtyOutcome.ALREADY_PROCESSED;
diff --git a/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java
index 894df66..9f54ca0 100644
--- a/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
+import java.util.function.Supplier;
 
 /**
  * An {@link EvaluationProgressReceiver} that delegates to a bunch of other
@@ -61,9 +61,12 @@
   }
 
   @Override
-  public void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state) {
+  public void evaluated(
+      SkyKey skyKey,
+      Supplier<EvaluationSuccessState> evaluationSuccessState,
+      EvaluationState state) {
     for (EvaluationProgressReceiver receiver : receivers) {
-      receiver.evaluated(skyKey, valueSupplier, state);
+      receiver.evaluated(skyKey, evaluationSuccessState, state);
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java
index 22f9dfb..820fb51 100644
--- a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java
@@ -13,10 +13,10 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.Set;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 
 /**
@@ -106,10 +106,12 @@
   }
 
   @Override
-  public void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier,
+  public void evaluated(
+      SkyKey skyKey,
+      Supplier<EvaluationSuccessState> evaluationSuccessState,
       EvaluationState state) {
     if (progressReceiver != null) {
-      progressReceiver.evaluated(skyKey, valueSupplier, state);
+      progressReceiver.evaluated(skyKey, evaluationSuccessState, state);
     }
 
     // This key was either built or marked clean, so we can remove it from both the dirty and
diff --git a/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
index 2844ec4..d93812b 100644
--- a/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.common.base.Supplier;
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
+import java.util.function.Supplier;
 
 /** Receiver for various stages of the lifetime of a skyframe node evaluation. */
 @ThreadSafety.ThreadSafe
@@ -29,6 +29,26 @@
     CLEAN,
   }
 
+  /** Whether or not evaluation of this node succeeded. */
+  enum EvaluationSuccessState {
+    SUCCESS(true),
+    FAILURE(false);
+
+    EvaluationSuccessState(boolean succeeded) {
+      this.succeeded = succeeded;
+    }
+
+    private final boolean succeeded;
+
+    public boolean succeeded() {
+      return succeeded;
+    }
+
+    public Supplier<EvaluationSuccessState> supplier() {
+      return () -> this;
+    }
+  }
+
   /**
    * New state of the value entry after invalidation.
    */
@@ -97,10 +117,13 @@
    *
    * <p>{@code state} indicates the new state of the node.
    *
-   * <p>If the value builder threw an error when building this node, then
-   * {@code valueSupplier.get()} evaluates to null.
+   * <p>If the value builder threw an error when building this node, then {@code
+   * valueSupplier.get()} evaluates to null.
    */
-  void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state);
+  void evaluated(
+      SkyKey skyKey,
+      Supplier<EvaluationSuccessState> evaluationSuccessState,
+      EvaluationState state);
 
   /** An {@link EvaluationProgressReceiver} that does nothing. */
   class NullEvaluationProgressReceiver implements EvaluationProgressReceiver {
@@ -121,7 +144,9 @@
     }
 
     @Override
-    public void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state) {
-    }
+    public void evaluated(
+        SkyKey skyKey,
+        Supplier<EvaluationSuccessState> evaluationSuccessState,
+        EvaluationState state) {}
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyValueSupplier.java b/src/main/java/com/google/devtools/build/skyframe/EvaluationSuccessStateSupplier.java
similarity index 67%
rename from src/main/java/com/google/devtools/build/skyframe/SkyValueSupplier.java
rename to src/main/java/com/google/devtools/build/skyframe/EvaluationSuccessStateSupplier.java
index d05dbd7..f4c320c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyValueSupplier.java
+++ b/src/main/java/com/google/devtools/build/skyframe/EvaluationSuccessStateSupplier.java
@@ -14,22 +14,25 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.base.Supplier;
+import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationSuccessState;
 
 /**
- * Supplier of {@link SkyValue} that crashes if its contained {@link NodeEntry} throws an {@link
- * InterruptedException} on value retrieval.
+ * Supplier of {@link EvaluationSuccessState} that crashes if its contained {@link NodeEntry} throws
+ * an {@link InterruptedException} on value retrieval.
  */
-class SkyValueSupplier implements Supplier<SkyValue> {
+class EvaluationSuccessStateSupplier implements Supplier<EvaluationSuccessState> {
   private final NodeEntry state;
 
-  SkyValueSupplier(NodeEntry state) {
+  EvaluationSuccessStateSupplier(NodeEntry state) {
     this.state = state;
   }
 
   @Override
-  public SkyValue get() {
+  public EvaluationSuccessState get() {
     try {
-      return state.getValue();
+      return state.getValue() != null
+          ? EvaluationSuccessState.SUCCESS
+          : EvaluationSuccessState.FAILURE;
     } catch (InterruptedException e) {
       throw new IllegalStateException(
           "Graph implementations in which value retrieval can block should not be used in "
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
index 905e822..67b7176 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -562,7 +562,7 @@
         .getProgressReceiver()
         .evaluated(
             skyKey,
-            new SkyValueSupplier(primaryEntry),
+            new EvaluationSuccessStateSupplier(primaryEntry),
             valueVersion.equals(evaluatorContext.getGraphVersion())
                 ? EvaluationState.BUILT
                 : EvaluationState.CLEAN);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 7dc9f95..6e62d1a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -23,7 +23,6 @@
 import static com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFileFactoryForTesting.symlinkToFileForTesting;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
@@ -73,6 +72,7 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Test;
@@ -326,7 +326,7 @@
   private static final class RecordingEvaluationProgressReceiver
       extends EvaluationProgressReceiver.NullEvaluationProgressReceiver {
     Set<SkyKey> invalidations;
-    Set<SkyValue> evaluations;
+    Set<SkyKey> evaluations;
 
     RecordingEvaluationProgressReceiver() {
       clear();
@@ -344,10 +344,11 @@
 
     @Override
     public void evaluated(
-        SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
-      SkyValue value = skyValueSupplier.get();
-      if (value != null) {
-        evaluations.add(value);
+        SkyKey skyKey,
+        Supplier<EvaluationSuccessState> evaluationSuccessState,
+        EvaluationState state) {
+      if (evaluationSuccessState.get().succeeded()) {
+        evaluations.add(skyKey);
       }
     }
   }
@@ -382,14 +383,14 @@
     ResolvedFile expected = regularFileForTesting(rootedPath);
     RecursiveFilesystemTraversalValue v1 = traverseAndAssertFiles(traversalRoot, expected);
     assertThat(progressReceiver.invalidations).isEmpty();
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     progressReceiver.clear();
 
     // Edit the file and verify that the value is rebuilt.
     appendToFile(rootArtifact, "bar");
     RecursiveFilesystemTraversalValue v2 = traverseAndAssertFiles(traversalRoot, expected);
     assertThat(progressReceiver.invalidations).contains(traversalRoot);
-    assertThat(progressReceiver.evaluations).contains(v2);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     assertThat(v2).isNotEqualTo(v1);
     assertTraversalRootHashesAreNotEqual(v1, v2);
 
@@ -422,14 +423,14 @@
     ResolvedFile expected = symlinkToFileForTesting(symlinkTargetPath, symlinkNamePath, linkValue);
     RecursiveFilesystemTraversalValue v1 = traverseAndAssertFiles(traversalRoot, expected);
     assertThat(progressReceiver.invalidations).isEmpty();
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     progressReceiver.clear();
 
     // Edit the target of the symlink and verify that the value is rebuilt.
     appendToFile(linkTargetArtifact, "bar");
     RecursiveFilesystemTraversalValue v2 = traverseAndAssertFiles(traversalRoot, expected);
     assertThat(progressReceiver.invalidations).contains(traversalRoot);
-    assertThat(progressReceiver.evaluations).contains(v2);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     assertThat(v2).isNotEqualTo(v1);
     assertTraversalRootHashesAreNotEqual(v1, v2);
   }
@@ -477,7 +478,7 @@
     RecursiveFilesystemTraversalValue v1 =
         traverseAndAssertFiles(traversalRoot, expected1, expected2);
     assertThat(progressReceiver.invalidations).isEmpty();
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     progressReceiver.clear();
 
     // Add a new file to the directory and see that the value is rebuilt.
@@ -493,7 +494,7 @@
     RecursiveFilesystemTraversalValue v2 =
         traverseAndAssertFiles(traversalRoot, expected1, expected2, expected3);
     assertThat(progressReceiver.invalidations).contains(traversalRoot);
-    assertThat(progressReceiver.evaluations).contains(v2);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     // Directories always have the same hash code, but that is fine because their contents are also
     // part of the RecursiveFilesystemTraversalValue, so v1 and v2 are unequal.
     assertThat(v2).isNotEqualTo(v1);
@@ -507,7 +508,7 @@
       appendToFile(file1, toInvalidate, "bar");
       v3 = traverseAndAssertFiles(traversalRoot, expected1, expected2, expected3);
       assertThat(progressReceiver.invalidations).contains(traversalRoot);
-      assertThat(progressReceiver.evaluations).contains(v3);
+      assertThat(progressReceiver.evaluations).contains(traversalRoot);
       assertThat(v3).isNotEqualTo(v2);
       // Directories always have the same hash code, but that is fine because their contents are
       // also part of the RecursiveFilesystemTraversalValue, so v2 and v3 are unequal.
@@ -602,7 +603,7 @@
     RecursiveFilesystemTraversalValue v1 =
         traverseAndAssertFiles(traversalRoot, expected1, expected2, expected3);
     assertThat(progressReceiver.invalidations).isEmpty();
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     progressReceiver.clear();
 
     // Add a new file to the directory and see that the value is rebuilt.
@@ -612,7 +613,7 @@
     RecursiveFilesystemTraversalValue v2 =
         traverseAndAssertFiles(traversalRoot, expected1, expected2, expected3, expected4);
     assertThat(progressReceiver.invalidations).contains(traversalRoot);
-    assertThat(progressReceiver.evaluations).contains(v2);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     assertThat(v2).isNotEqualTo(v1);
     assertTraversalRootHashesAreNotEqual(v1, v2);
     progressReceiver.clear();
@@ -622,7 +623,7 @@
     RecursiveFilesystemTraversalValue v3 =
         traverseAndAssertFiles(traversalRoot, expected1, expected2, expected3, expected4);
     assertThat(progressReceiver.invalidations).contains(traversalRoot);
-    assertThat(progressReceiver.evaluations).contains(v3);
+    assertThat(progressReceiver.evaluations).contains(traversalRoot);
     assertThat(v3).isNotEqualTo(v2);
     assertTraversalRootHashesAreNotEqual(v2, v3);
     progressReceiver.clear();
@@ -805,7 +806,7 @@
     TraversalRequest params = fileLikeRoot(artifact, DONT_CROSS);
     ResolvedFile expected = regularFileForTesting(path);
     RecursiveFilesystemTraversalValue v1 = traverseAndAssertFiles(params, expected);
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(params);
     progressReceiver.clear();
 
     // Change the digest of the file. See that the value is rebuilt.
@@ -826,7 +827,7 @@
     TraversalRequest params = fileLikeRoot(artifact, DONT_CROSS);
     ResolvedFile expected = regularFileForTesting(path);
     RecursiveFilesystemTraversalValue v1 = traverseAndAssertFiles(params, expected);
-    assertThat(progressReceiver.evaluations).contains(v1);
+    assertThat(progressReceiver.evaluations).contains(params);
     progressReceiver.clear();
 
     // Change the mtime of the file but not the digest. See that the value is *not* rebuilt.
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
index 5332637..00cdc24 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
@@ -16,7 +16,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.base.Objects;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -42,7 +41,6 @@
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
 import com.google.devtools.build.skyframe.SkyKey;
-import com.google.devtools.build.skyframe.SkyValue;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -50,6 +48,7 @@
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 import org.junit.Before;
 import org.junit.Test;
@@ -99,14 +98,14 @@
       }
     }
 
-    public static final class EvaluatedEntry {
+    private static final class EvaluatedEntry {
       public final SkyKey skyKey;
-      public final SkyValue value;
+      final EvaluationSuccessState successState;
       public final EvaluationState state;
 
-      EvaluatedEntry(SkyKey skyKey, SkyValue value, EvaluationState state) {
+      EvaluatedEntry(SkyKey skyKey, EvaluationSuccessState successState, EvaluationState state) {
         this.skyKey = skyKey;
-        this.value = value;
+        this.successState = successState;
         this.state = state;
       }
 
@@ -114,13 +113,13 @@
       public boolean equals(Object obj) {
         return obj instanceof EvaluatedEntry
             && this.skyKey.equals(((EvaluatedEntry) obj).skyKey)
-            && this.value.equals(((EvaluatedEntry) obj).value)
+            && this.successState.equals(((EvaluatedEntry) obj).successState)
             && this.state.equals(((EvaluatedEntry) obj).state);
       }
 
       @Override
       public int hashCode() {
-        return Objects.hashCode(skyKey, value, state);
+        return Objects.hashCode(skyKey, successState, state);
       }
     }
 
@@ -164,8 +163,10 @@
 
     @Override
     public void evaluated(
-        SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
-      evaluated.add(new EvaluatedEntry(skyKey, skyValueSupplier.get(), state));
+        SkyKey skyKey,
+        Supplier<EvaluationSuccessState> evaluationSuccessState,
+        EvaluationState state) {
+      evaluated.add(new EvaluatedEntry(skyKey, evaluationSuccessState.get(), state));
     }
   }
 
@@ -417,7 +418,6 @@
     TrackingEvaluationProgressReceiver.EvaluatedEntry evaluatedAction =
         progressReceiver.getEvalutedEntry(actionKey);
     assertThat(evaluatedAction).isNotNull();
-    SkyValue actionValue = evaluatedAction.value;
 
     // Mutate the action input if requested.
     maybeChangeFile(actionInput, changeActionInput);
@@ -451,12 +451,10 @@
       if (expectActionIs.actuallyClean()) {
         // Action was dirtied but verified clean.
         assertThat(newEntry.state).isEqualTo(EvaluationState.CLEAN);
-        assertThat(newEntry.value).isEqualTo(actionValue);
       } else {
         // Action was dirtied and rebuilt. It was either reexecuted or was an action cache hit,
         // doesn't matter here.
         assertThat(newEntry.state).isEqualTo(EvaluationState.BUILT);
-        assertThat(newEntry.value).isNotEqualTo(actionValue);
       }
     } else {
       // Action was not dirtied.
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index ef7ada3..2be4f1b 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -26,7 +26,6 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -62,6 +61,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 import org.junit.After;
 import org.junit.Before;
@@ -4336,7 +4336,9 @@
         new TrackingProgressReceiver() {
           @Override
           public void evaluated(
-              SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
+              SkyKey skyKey,
+              Supplier<EvaluationSuccessState> evaluationSuccessState,
+              EvaluationState state) {
             evaluated.add(skyKey);
           }
         });
@@ -4472,7 +4474,9 @@
         new TrackingProgressReceiver() {
           @Override
           public void evaluated(
-              SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
+              SkyKey skyKey,
+              Supplier<EvaluationSuccessState> evaluationSuccessState,
+              EvaluationState state) {
             evaluated.add(skyKey);
           }
         });
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index 8fd7287..c702bae 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -21,7 +21,6 @@
 import static com.google.devtools.build.skyframe.GraphTester.CONCATENATE;
 import static org.junit.Assert.fail;
 
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -55,6 +54,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 import org.junit.After;
 import org.junit.Before;
@@ -256,14 +256,17 @@
       eval(/*keepGoing=*/false, fastKey);
     }
     final Set<SkyKey> receivedValues = Sets.newConcurrentHashSet();
-    revalidationReceiver = new DirtyTrackingProgressReceiver(
-        new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
-      @Override
-      public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
-          EvaluationState state) {
-        receivedValues.add(skyKey);
-      }
-    });
+    revalidationReceiver =
+        new DirtyTrackingProgressReceiver(
+            new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
+              @Override
+              public void evaluated(
+                  SkyKey skyKey,
+                  Supplier<EvaluationSuccessState> evaluationSuccessState,
+                  EvaluationState state) {
+                receivedValues.add(skyKey);
+              }
+            });
     TestThread evalThread = new TestThread() {
       @Override
       public void runTest() throws Exception {
@@ -1910,17 +1913,19 @@
     final Set<SkyKey> evaluatedValues = Sets.newConcurrentHashSet();
     EvaluationProgressReceiver progressReceiver =
         new EvaluationProgressReceiver.NullEvaluationProgressReceiver() {
-      @Override
-      public void enqueueing(SkyKey skyKey) {
-        enqueuedValues.add(skyKey);
-      }
+          @Override
+          public void enqueueing(SkyKey skyKey) {
+            enqueuedValues.add(skyKey);
+          }
 
-      @Override
-      public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
-          EvaluationState state) {
-        evaluatedValues.add(skyKey);
-      }
-    };
+          @Override
+          public void evaluated(
+              SkyKey skyKey,
+              Supplier<EvaluationSuccessState> evaluationSuccessState,
+              EvaluationState state) {
+            evaluatedValues.add(skyKey);
+          }
+        };
 
     ExtendedEventHandler reporter =
         new Reporter(
diff --git a/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java b/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java
index 133add7..627460c 100644
--- a/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java
+++ b/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java
@@ -14,9 +14,9 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.Sets;
 import java.util.Set;
+import java.util.function.Supplier;
 
 /**
  * A testing utility to keep track of evaluation.
@@ -50,9 +50,12 @@
   }
 
   @Override
-  public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
+  public void evaluated(
+      SkyKey skyKey,
+      Supplier<EvaluationSuccessState> evaluationSuccessState,
+      EvaluationState state) {
     evaluated.add(skyKey);
-    if (skyValueSupplier.get() != null) {
+    if (evaluationSuccessState.get().succeeded()) {
       deleted.remove(skyKey);
       if (state.equals(EvaluationState.CLEAN)) {
         dirty.remove(skyKey);