Provide more reporting options to SkyFunctions 

With more specific information to be reported by Skyfunctions, e.g.,
to inform the build-event protocol on missing files, the EventHandler
interface is no longer enough. Therefore, provide an enriched context
for reporting events.

--
Change-Id: I2d06166fe4d5b9054e24ad8c752fafc039e3f9f8
Reviewed-on: https://cr.bazel.build/8794
PiperOrigin-RevId: 148463437
MOS_MIGRATED_REVID=148463437
diff --git a/src/main/java/com/google/devtools/build/skyframe/BuildDriver.java b/src/main/java/com/google/devtools/build/skyframe/BuildDriver.java
index 654dfae..ec6ccbf 100644
--- a/src/main/java/com/google/devtools/build/skyframe/BuildDriver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/BuildDriver.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.skyframe;
 
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.common.options.OptionsClassProvider;
 import javax.annotation.Nullable;
@@ -22,11 +22,11 @@
 /** A BuildDriver wraps a MemoizingEvaluator, passing along the proper Version. */
 public interface BuildDriver {
   /**
-   * See {@link MemoizingEvaluator#evaluate}, which has the same semantics except for the
-   * inclusion of a {@link Version} value.
+   * See {@link MemoizingEvaluator#evaluate}, which has the same semantics except for the inclusion
+   * of a {@link Version} value.
    */
   <T extends SkyValue> EvaluationResult<T> evaluate(
-      Iterable<SkyKey> roots, boolean keepGoing, int numThreads, EventHandler reporter)
+      Iterable<SkyKey> roots, boolean keepGoing, int numThreads, ExtendedEventHandler reporter)
       throws InterruptedException;
 
   /**
diff --git a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
index c7aa46e..2a4e999 100644
--- a/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
+++ b/src/main/java/com/google/devtools/build/skyframe/CyclesReporter.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.Preconditions;
 
 /**
@@ -33,17 +33,20 @@
   public interface SingleCycleReporter {
 
     /**
-     * Reports the given cycle and returns {@code true}, or return {@code false} if this
-     * {@link SingleCycleReporter} doesn't know how to report the cycle.
+     * Reports the given cycle and returns {@code true}, or return {@code false} if this {@link
+     * SingleCycleReporter} doesn't know how to report the cycle.
      *
      * @param topLevelKey the top level key that transitively depended on the cycle
      * @param cycleInfo the cycle
-     * @param alreadyReported whether the cycle has already been reported to the
-     *        {@link CyclesReporter}.
+     * @param alreadyReported whether the cycle has already been reported to the {@link
+     *     CyclesReporter}.
      * @param eventHandler the eventHandler to which to report the error
      */
-    boolean maybeReportCycle(SkyKey topLevelKey, CycleInfo cycleInfo, boolean alreadyReported,
-        EventHandler eventHandler);
+    boolean maybeReportCycle(
+        SkyKey topLevelKey,
+        CycleInfo cycleInfo,
+        boolean alreadyReported,
+        ExtendedEventHandler eventHandler);
   }
 
   private final ImmutableList<SingleCycleReporter> cycleReporters;
@@ -64,8 +67,8 @@
    * @param topLevelKey This key represents the top level value key that returned cycle errors.
    * @param eventHandler the eventHandler to which to report the error
    */
-  public void reportCycles(Iterable<CycleInfo> cycles, SkyKey topLevelKey,
-      EventHandler eventHandler) {
+  public void reportCycles(
+      Iterable<CycleInfo> cycles, SkyKey topLevelKey, ExtendedEventHandler eventHandler) {
     Preconditions.checkNotNull(eventHandler);
     for (CycleInfo cycleInfo : cycles) {
       boolean alreadyReported = false;
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index c0f0ed4..68998b3 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -21,7 +21,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.Differencer.Diff;
 import com.google.devtools.build.skyframe.InvalidatingNodeVisitor.DeletingInvalidationState;
@@ -136,8 +136,12 @@
   }
 
   @Override
-  public <T extends SkyValue> EvaluationResult<T> evaluate(Iterable<SkyKey> roots, Version version,
-          boolean keepGoing, int numThreads, EventHandler eventHandler)
+  public <T extends SkyValue> EvaluationResult<T> evaluate(
+      Iterable<SkyKey> roots,
+      Version version,
+      boolean keepGoing,
+      int numThreads,
+      ExtendedEventHandler eventHandler)
       throws InterruptedException {
     // NOTE: Performance critical code. See bug "Null build performance parity".
     IntVersion intVersion = (IntVersion) version;
diff --git a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
index 114ccb4..d690c4a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
@@ -18,7 +18,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetVisitor;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadHostile;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import java.io.PrintStream;
 import java.util.Map;
 import javax.annotation.Nullable;
@@ -49,8 +49,8 @@
       Version version,
       boolean keepGoing,
       int numThreads,
-      EventHandler reporter)
-          throws InterruptedException;
+      ExtendedEventHandler reporter)
+      throws InterruptedException;
 
   /**
    * Ensures that after the next completed {@link #evaluate} call the current values of any value
diff --git a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
index d904805..34515c8 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
@@ -22,7 +22,7 @@
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.profiler.Profiler;
 import com.google.devtools.build.lib.profiler.ProfilerTask;
 import com.google.devtools.build.lib.util.BlazeClock;
@@ -100,7 +100,7 @@
       ProcessableGraph graph,
       Version graphVersion,
       ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions,
-      final EventHandler reporter,
+      final ExtendedEventHandler reporter,
       EmittedEventState emittedEventState,
       EventFilter storedEventFilter,
       boolean keepGoing,
@@ -127,7 +127,7 @@
       ProcessableGraph graph,
       Version graphVersion,
       ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions,
-      final EventHandler reporter,
+      final ExtendedEventHandler reporter,
       EmittedEventState emittedEventState,
       EventFilter storedEventFilter,
       boolean keepGoing,
diff --git a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java
index 9365ffa..49782ce 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluatorContext.java
@@ -19,7 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetVisitor;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.MemoizingEvaluator.EmittedEventState;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
@@ -44,7 +44,7 @@
   private final QueryableGraph graph;
   private final Version graphVersion;
   private final ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions;
-  private final EventHandler reporter;
+  private final ExtendedEventHandler reporter;
   private final NestedSetVisitor<TaggedEvents> replayingNestedSetEventVisitor;
   private final boolean keepGoing;
   private final boolean storeErrorsAlongsideValues;
@@ -62,7 +62,7 @@
       QueryableGraph graph,
       Version graphVersion,
       ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions,
-      EventHandler reporter,
+      ExtendedEventHandler reporter,
       EmittedEventState emittedEventState,
       boolean keepGoing,
       boolean storeErrorsAlongsideValues,
@@ -95,7 +95,7 @@
       QueryableGraph graph,
       Version graphVersion,
       ImmutableMap<SkyFunctionName, ? extends SkyFunction> skyFunctions,
-      EventHandler reporter,
+      ExtendedEventHandler reporter,
       EmittedEventState emittedEventState,
       boolean keepGoing,
       boolean storeErrorsAlongsideValues,
@@ -191,7 +191,7 @@
     return replayingNestedSetEventVisitor;
   }
 
-  EventHandler getReporter() {
+  ExtendedEventHandler getReporter() {
     return reporter;
   }
 
@@ -210,9 +210,9 @@
   /** Receives the events from the NestedSet and delegates to the reporter. */
   private static class NestedSetEventReceiver implements NestedSetVisitor.Receiver<TaggedEvents> {
 
-    private final EventHandler reporter;
+    private final ExtendedEventHandler reporter;
 
-    public NestedSetEventReceiver(EventHandler reporter) {
+    public NestedSetEventReceiver(ExtendedEventHandler reporter) {
       this.reporter = reporter;
     }
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/QueryableGraphBackedSkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/QueryableGraphBackedSkyFunctionEnvironment.java
index a528dad..684db93 100644
--- a/src/main/java/com/google/devtools/build/skyframe/QueryableGraphBackedSkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/QueryableGraphBackedSkyFunctionEnvironment.java
@@ -15,7 +15,7 @@
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
 import java.util.Map;
@@ -27,10 +27,10 @@
  */
 public class QueryableGraphBackedSkyFunctionEnvironment extends AbstractSkyFunctionEnvironment {
   private final QueryableGraph queryableGraph;
-  private final EventHandler eventHandler;
+  private final ExtendedEventHandler eventHandler;
 
   public QueryableGraphBackedSkyFunctionEnvironment(
-      QueryableGraph queryableGraph, EventHandler eventHandler) {
+      QueryableGraph queryableGraph, ExtendedEventHandler eventHandler) {
     this.queryableGraph = queryableGraph;
     this.eventHandler = eventHandler;
   }
@@ -75,7 +75,7 @@
   }
 
   @Override
-  public EventHandler getListener() {
+  public ExtendedEventHandler getListener() {
     return eventHandler;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
index f28a800..7f4c9fe 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
@@ -13,7 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.skyframe;
 
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.util.Preconditions;
 import com.google.devtools.common.options.OptionsClassProvider;
 import javax.annotation.Nullable;
@@ -32,7 +32,7 @@
 
   @Override
   public <T extends SkyValue> EvaluationResult<T> evaluate(
-      Iterable<SkyKey> roots, boolean keepGoing, int numThreads, EventHandler reporter)
+      Iterable<SkyKey> roots, boolean keepGoing, int numThreads, ExtendedEventHandler reporter)
       throws InterruptedException {
     try {
       return memoizingEvaluator.evaluate(roots, curVersion, keepGoing, numThreads, reporter);
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java
index 6bd52c6..ee1d93c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunction.java
@@ -15,7 +15,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import java.util.Map;
 import javax.annotation.Nullable;
 
@@ -267,10 +267,10 @@
     boolean valuesMissing();
 
     /**
-     * Returns the {@link EventHandler} that a SkyFunction should use to print any errors,
-     * warnings, or progress messages during execution of {@link SkyFunction#compute}.
+     * Returns the {@link EventHandler} that a SkyFunction should use to print any errors, warnings,
+     * or progress messages during execution of {@link SkyFunction#compute}.
      */
-    EventHandler getListener();
+    ExtendedEventHandler getListener();
 
     /** Returns whether we are currently in error bubbling. */
     @VisibleForTesting
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 28fb512..93e90cd 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.util.GroupedList;
 import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
@@ -479,7 +479,7 @@
   }
 
   @Override
-  public EventHandler getListener() {
+  public ExtendedEventHandler getListener() {
     checkActive();
     return eventHandler;
   }
diff --git a/src/main/java/com/google/devtools/build/skyframe/WalkableGraph.java b/src/main/java/com/google/devtools/build/skyframe/WalkableGraph.java
index 8f3dd04..5b98079 100644
--- a/src/main/java/com/google/devtools/build/skyframe/WalkableGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/WalkableGraph.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
-import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
 import java.util.Collection;
 import java.util.Map;
@@ -99,7 +99,8 @@
   /** Provides a WalkableGraph on demand after preparing it. */
   interface WalkableGraphFactory {
     EvaluationResult<SkyValue> prepareAndGet(
-        SkyKey universeKey, int numThreads, EventHandler eventHandler) throws InterruptedException;
+        SkyKey universeKey, int numThreads, ExtendedEventHandler eventHandler)
+        throws InterruptedException;
 
     /**
      * Returns true if this instance has already been used to {@link #prepareAndGet} {@code