Remove all direct uses of SkyframeExecutor.reporter.

Instead, pass an appropriate EventHandler instance in. This is in preparation
for creating a per-command EventHandler, in preparation for allowing multiple
commands to run in parallel. This is removal of shared global state.

--
MOS_MIGRATED_REVID=103828963
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index 485a845..97a30fb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -642,13 +642,13 @@
     if (loadingEnabled) {
       setArtifactRoots(loadingResult.getPackageRoots(), configurations);
     }
-    prepareToBuild(configurations, new SkyframePackageRootResolver(skyframeExecutor));
+    prepareToBuild(configurations, new SkyframePackageRootResolver(skyframeExecutor, eventHandler));
     skyframeExecutor.injectWorkspaceStatusData();
     SkyframeAnalysisResult skyframeAnalysisResult;
     try {
       skyframeAnalysisResult =
           skyframeBuildView.configureTargets(
-              targetSpecs, aspectKeys, eventBus, viewOptions.keepGoing);
+              eventHandler, targetSpecs, aspectKeys, eventBus, viewOptions.keepGoing);
       setArtifactRoots(skyframeAnalysisResult.getPackageRoots(), configurations);
     } finally {
       skyframeBuildView.clearInvalidatedConfiguredTargets();
@@ -666,6 +666,7 @@
 
     AnalysisResult result =
         createResult(
+            eventHandler,
             loadingResult,
             topLevelOptions,
             viewOptions,
@@ -679,6 +680,7 @@
   }
 
   private AnalysisResult createResult(
+      EventHandler eventHandler,
       LoadingResult loadingResult,
       TopLevelArtifactContext topLevelOptions,
       BuildView.Options viewOptions,
@@ -701,7 +703,8 @@
     Set<ConfiguredTarget> exclusiveTests = new HashSet<>();
 
     // build-info and build-changelist.
-    Collection<Artifact> buildInfoArtifacts = skyframeExecutor.getWorkspaceStatusArtifacts();
+    Collection<Artifact> buildInfoArtifacts =
+        skyframeExecutor.getWorkspaceStatusArtifacts(eventHandler);
     Preconditions.checkState(buildInfoArtifacts.size() == 2, buildInfoArtifacts);
     artifactsToBuild.addAll(buildInfoArtifacts);
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/SkyframePackageRootResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/SkyframePackageRootResolver.java
index db24b5e..cf78c6c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/SkyframePackageRootResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/SkyframePackageRootResolver.java
@@ -17,6 +17,7 @@
 import com.google.devtools.build.lib.actions.PackageRootResolutionException;
 import com.google.devtools.build.lib.actions.PackageRootResolver;
 import com.google.devtools.build.lib.actions.Root;
+import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
@@ -29,14 +30,16 @@
  */
 public final class SkyframePackageRootResolver implements PackageRootResolver {
   private final SkyframeExecutor executor;
+  private final EventHandler eventHandler;
 
-  public SkyframePackageRootResolver(SkyframeExecutor executor) {
+  public SkyframePackageRootResolver(SkyframeExecutor executor, EventHandler eventHandler) {
     this.executor = executor;
+    this.eventHandler = eventHandler;
   }
 
   @Override
   public Map<PathFragment, Root> findPackageRoots(Iterable<PathFragment> execPaths)
       throws PackageRootResolutionException {
-    return executor.getArtifactRoots(execPaths);
+    return executor.getArtifactRoots(eventHandler, execPaths);
   }
 }
\ No newline at end of file
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index ea1604a..e9d7369 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -436,6 +436,7 @@
       Profiler.instance().markPhase(ProfilePhase.EXECUTE);
 
       builder.buildArtifacts(
+          env.getReporter(),
           additionalArtifacts,
           analysisResult.getParallelTests(),
           analysisResult.getExclusiveTests(),
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
index 0a30169..535fe7e 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
@@ -35,6 +35,7 @@
 import com.google.devtools.build.lib.analysis.AspectCompleteEvent;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.TargetCompleteEvent;
+import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.packages.BuildFileNotFoundException;
 import com.google.devtools.build.lib.rules.test.TestProvider;
 import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog;
@@ -97,6 +98,7 @@
 
   @Override
   public void buildArtifacts(
+      EventHandler eventHandler,
       Set<Artifact> artifacts,
       Set<ConfiguredTarget> parallelTests,
       Set<ConfiguredTarget> exclusiveTests,
@@ -120,7 +122,7 @@
     EvaluationResult<?> result;
 
     ActionExecutionStatusReporter statusReporter = ActionExecutionStatusReporter.create(
-        skyframeExecutor.getReporter(), executor, skyframeExecutor.getEventBus());
+        eventHandler, executor, skyframeExecutor.getEventBus());
 
     AtomicBoolean isBuildingExclusiveArtifacts = new AtomicBoolean(false);
     ActionExecutionInactivityWatchdog watchdog = new ActionExecutionInactivityWatchdog(
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 6584af6..e714708 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -35,7 +35,6 @@
 import com.google.common.eventbus.SubscriberExceptionHandler;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.Uninterruptibles;
-import com.google.devtools.build.lib.actions.PackageRootResolver;
 import com.google.devtools.build.lib.actions.cache.ActionCache;
 import com.google.devtools.build.lib.actions.cache.CompactPersistentActionCache;
 import com.google.devtools.build.lib.actions.cache.NullActionCache;
@@ -43,7 +42,6 @@
 import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
 import com.google.devtools.build.lib.analysis.BuildView;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
-import com.google.devtools.build.lib.analysis.SkyframePackageRootResolver;
 import com.google.devtools.build.lib.analysis.WorkspaceStatusAction;
 import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -173,7 +171,6 @@
   private final Reporter reporter;
   private final LoadingPhaseRunner loadingPhaseRunner;
   private final PackageFactory packageFactory;
-  private final PackageRootResolver packageRootResolver;
   private final ConfigurationFactory configurationFactory;
   private final ConfiguredRuleClassProvider ruleClassProvider;
   private final BuildView view;
@@ -219,7 +216,6 @@
     this.projectFileProvider = projectFileProvider;
 
     this.skyframeExecutor = skyframeExecutor;
-    this.packageRootResolver = new SkyframePackageRootResolver(skyframeExecutor);
     this.loadingPhaseRunner = new LoadingPhaseRunner(
         skyframeExecutor.getPackageManager(),
         pkgFactory.getRuleClassNames());
@@ -527,10 +523,6 @@
     return skyframeExecutor.getPackageManager();
   }
 
-  public PackageRootResolver getPackageRootResolver() {
-    return packageRootResolver;
-  }
-
   public WorkspaceStatusAction.Factory getworkspaceStatusActionFactory() {
     return workspaceStatusActionFactory;
   }
@@ -882,7 +874,7 @@
     if (!skyframeExecutor.hasIncrementalState()) {
       clearSkyframeRelevantCaches();
     }
-    skyframeExecutor.sync(packageCacheOptions, getOutputBase(), getWorkingDirectory(),
+    skyframeExecutor.sync(reporter, packageCacheOptions, getOutputBase(), getWorkingDirectory(),
         defaultsPackageContents, commandId);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
index 64a617e..f0c21bf 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/CommandEnvironment.java
@@ -18,9 +18,11 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.eventbus.EventBus;
+import com.google.devtools.build.lib.actions.PackageRootResolver;
 import com.google.devtools.build.lib.actions.cache.ActionCache;
 import com.google.devtools.build.lib.analysis.BlazeDirectories;
 import com.google.devtools.build.lib.analysis.BuildView;
+import com.google.devtools.build.lib.analysis.SkyframePackageRootResolver;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
 import com.google.devtools.build.lib.analysis.config.BuildOptions;
@@ -139,6 +141,10 @@
     return runtime.getView();
   }
 
+  public PackageRootResolver getPackageRootResolver() {
+    return new SkyframePackageRootResolver(getSkyframeExecutor(), reporter);
+  }
+
   /**
    * Returns the UUID that Blaze uses to identify everything logged from the current build command.
    * It's also used to invalidate Skyframe nodes that are specific to a certain invocation, such as
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java b/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
index 67e32b1..2985a2c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.actions.TestExecException;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
+import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.util.AbruptExitException;
 
 import java.util.Collection;
@@ -71,6 +72,7 @@
    */
   @ThreadCompatible
   void buildArtifacts(
+      EventHandler eventHandler,
       Set<Artifact> artifacts,
       Set<ConfiguredTarget> parallelTests,
       Set<ConfiguredTarget> exclusiveTests,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index df9a1b8..9a703e8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -26,9 +26,7 @@
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
-import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
 import com.google.devtools.build.lib.packages.BuildFileNotFoundException;
@@ -84,7 +82,6 @@
  */
 public class PackageFunction implements SkyFunction {
 
-  private final EventHandler reporter;
   private final PackageFactory packageFactory;
   private final CachingPackageLocator packageLocator;
   private final Cache<PackageIdentifier, Package.LegacyBuilder> packageFunctionCache;
@@ -102,7 +99,6 @@
   public static final String EXTERNAL_PACKAGE_NAME = "external";
 
   public PackageFunction(
-      Reporter reporter,
       PackageFactory packageFactory,
       CachingPackageLocator pkgLocator,
       AtomicBoolean showLoadingProgress,
@@ -110,9 +106,7 @@
       Cache<PackageIdentifier, Result> preprocessCache,
       AtomicInteger numPackagesLoaded,
       @Nullable SkylarkImportLookupFunction skylarkImportLookupFunctionForInlining) {
-    this.reporter = reporter;
     this.skylarkImportLookupFunctionForInlining = skylarkImportLookupFunctionForInlining;
-
     // Can be null in tests.
     this.preludePath = packageFactory == null
         ? null
@@ -474,7 +468,7 @@
       if (showLoadingProgress.get() && packageFunctionCache.getIfPresent(packageId) == null) {
         // TODO(bazel-team): don't duplicate the loading message if there are unavailable
         // Skylark dependencies.
-        reporter.handle(Event.progress("Loading package: " + packageName));
+        env.getListener().handle(Event.progress("Loading package: " + packageName));
       }
       inputSource = ParserInputSource.create(buildFilePath, buildFileValue.getSize());
     } catch (IOException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index c186d19..2e72186 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.analysis.config.BinTools;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.concurrent.Uninterruptibles;
+import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.packages.PackageFactory;
@@ -226,13 +227,13 @@
   }
 
   @Override
-  public void sync(PackageCacheOptions packageCacheOptions, Path outputBase, Path workingDirectory,
-                   String defaultsPackageContents, UUID commandId)
-      throws InterruptedException, AbruptExitException {
+  public void sync(EventHandler eventHandler, PackageCacheOptions packageCacheOptions,
+      Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId)
+          throws InterruptedException, AbruptExitException {
     this.valueCacheEvictionLimit = packageCacheOptions.minLoadedPkgCountForCtNodeEviction;
-    super.sync(
-        packageCacheOptions, outputBase, workingDirectory, defaultsPackageContents, commandId);
-    handleDiffs();
+    super.sync(eventHandler, packageCacheOptions, outputBase, workingDirectory,
+        defaultsPackageContents, commandId);
+    handleDiffs(eventHandler);
   }
 
   /**
@@ -285,11 +286,11 @@
    * Uses diff awareness on all the package paths to invalidate changed files.
    */
   @VisibleForTesting
-  public void handleDiffs() throws InterruptedException {
+  public void handleDiffs(EventHandler eventHandler) throws InterruptedException {
     if (lastAnalysisDiscarded) {
       // Values were cleared last build, but they couldn't be deleted because they were needed for
       // the execution phase. We can delete them now.
-      dropConfiguredTargetsNow();
+      dropConfiguredTargetsNow(eventHandler);
       lastAnalysisDiscarded = false;
     }
     modifiedFiles = 0;
@@ -307,7 +308,7 @@
       }
     }
     handleDiffsWithCompleteDiffInformation(modifiedFilesByPathEntry);
-    handleDiffsWithMissingDiffInformation(pathEntriesWithoutDiffInformation);
+    handleDiffsWithMissingDiffInformation(eventHandler, pathEntriesWithoutDiffInformation);
   }
 
   /**
@@ -333,7 +334,7 @@
    * Finds and invalidates changed files under path entries whose corresponding
    * {@link DiffAwareness} said all files may have been modified.
    */
-  private void handleDiffsWithMissingDiffInformation(
+  private void handleDiffsWithMissingDiffInformation(EventHandler eventHandler,
       Set<Pair<Path, DiffAwarenessManager.ProcessableModifiedFileSet>>
           pathEntriesWithoutDiffInformation) throws InterruptedException {
     if (pathEntriesWithoutDiffInformation.isEmpty() && Iterables.isEmpty(customDirtinessCheckers)) {
@@ -344,7 +345,7 @@
     // have actually been invalidated (recall that invalidation happens at the beginning of the
     // next evaluate() call), because checking those is a waste of time.
     buildDriver.evaluate(ImmutableList.<SkyKey>of(), false,
-        DEFAULT_THREAD_COUNT, reporter);
+        DEFAULT_THREAD_COUNT, eventHandler);
 
     FilesystemValueChecker fsvc = new FilesystemValueChecker(memoizingEvaluator, tsgm, null);
     // We need to manually check for changes to known files. This entails finding all dirty file
@@ -439,12 +440,12 @@
   }
 
   @Override
-  public void invalidateFilesUnderPathForTesting(ModifiedFileSet modifiedFileSet, Path pathEntry)
-      throws InterruptedException {
+  public void invalidateFilesUnderPathForTesting(EventHandler eventHandler,
+      ModifiedFileSet modifiedFileSet, Path pathEntry) throws InterruptedException {
     if (lastAnalysisDiscarded) {
       // Values were cleared last build, but they couldn't be deleted because they were needed for
       // the execution phase. We can delete them now.
-      dropConfiguredTargetsNow();
+      dropConfiguredTargetsNow(eventHandler);
       lastAnalysisDiscarded = false;
     }
     Differencer.Diff diff;
@@ -529,7 +530,7 @@
    * <p>WARNING: Note that a call to this method leaves legacy data inconsistent with Skyframe.
    * The next build should clear the legacy caches.
    */
-  private void dropConfiguredTargetsNow() {
+  private void dropConfiguredTargetsNow(final EventHandler eventHandler) {
     dropConfiguredTargets();
     // Run the invalidator to actually delete the values.
     try {
@@ -538,7 +539,7 @@
         @Override
         public Void call() throws InterruptedException {
           buildDriver.evaluate(ImmutableList.<SkyKey>of(), false,
-              ResourceUsage.getAvailableProcessors(), reporter);
+              ResourceUsage.getAvailableProcessors(), eventHandler);
           return null;
         }
       });
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 0c6d78e..5d86036 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
@@ -192,6 +192,7 @@
    * @return the configured targets that should be built along with a WalkableGraph of the analysis.
    */
   public SkyframeAnalysisResult configureTargets(
+      EventHandler eventHandler,
       List<ConfiguredTargetKey> values,
       List<AspectKey> aspectKeys,
       EventBus eventBus,
@@ -250,12 +251,12 @@
         try {
           ex.rethrowTyped();
         } catch (MutableActionGraph.ActionConflictException ace) {
-          ace.reportTo(skyframeExecutor.getReporter());
+          ace.reportTo(eventHandler);
           String errorMsg = "Analysis of target '" + bad.getKey().getOwner().getLabel()
               + "' failed; build aborted";
           throw new ViewCreationFailedException(errorMsg);
         } catch (ArtifactPrefixConflictException apce) {
-          skyframeExecutor.getReporter().handle(Event.error(apce.getMessage()));
+          eventHandler.handle(Event.error(apce.getMessage()));
         }
         throw new ViewCreationFailedException(ex.getMessage());
       }
@@ -265,14 +266,14 @@
       ErrorInfo errorInfo = error.getValue();
       assertSaneAnalysisError(errorInfo, topLevel);
       skyframeExecutor.getCyclesReporter().reportCycles(errorInfo.getCycleInfo(), topLevel,
-          skyframeExecutor.getReporter());
+          eventHandler);
       Throwable cause = errorInfo.getException();
       Preconditions.checkState(cause != null || !Iterables.isEmpty(errorInfo.getCycleInfo()),
           errorInfo);
       String errorMsg = "Analysis of target '" + ConfiguredTargetValue.extractLabel(topLevel)
           + "' failed; build aborted";
       if (cause instanceof ActionConflictException) {
-        ((ActionConflictException) cause).reportTo(skyframeExecutor.getReporter());
+        ((ActionConflictException) cause).reportTo(eventHandler);
       }
       throw new ViewCreationFailedException(errorMsg);
     }
@@ -286,7 +287,7 @@
         assertSaneAnalysisError(errorInfo, errorKey);
 
         skyframeExecutor.getCyclesReporter().reportCycles(errorInfo.getCycleInfo(), errorKey,
-            skyframeExecutor.getReporter());
+            eventHandler);
         // We try to get the root cause key first from ErrorInfo rootCauses. If we don't have one
         // we try to use the cycle culprit if the error is a cycle. Otherwise we use the top-level
         // error key.
@@ -300,9 +301,9 @@
         }
         Exception cause = errorInfo.getException();
         if (cause instanceof ActionConflictException) {
-          ((ActionConflictException) cause).reportTo(skyframeExecutor.getReporter());
+          ((ActionConflictException) cause).reportTo(eventHandler);
         }
-        skyframeExecutor.getReporter().handle(
+        eventHandler.handle(
             Event.warn("errors encountered while analyzing target '"
                 + label.getLabel() + "': it will not be built"));
         eventBus.post(new AnalysisFailureEvent(
@@ -316,13 +317,13 @@
       try {
         ex.rethrowTyped();
       } catch (MutableActionGraph.ActionConflictException ace) {
-        ace.reportTo(skyframeExecutor.getReporter());
-        skyframeExecutor.getReporter()
+        ace.reportTo(eventHandler);
+        eventHandler
             .handle(Event.warn("errors encountered while analyzing target '"
                 + bad.getKey().getOwner().getLabel() + "': it will not be built"));
       } catch (ArtifactPrefixConflictException apce) {
         if (reportedExceptions.add(apce)) {
-          skyframeExecutor.getReporter().handle(Event.error(apce.getMessage()));
+          eventHandler.handle(Event.error(apce.getMessage()));
         }
       }
     }
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 103932c..05ceedd 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
@@ -155,7 +155,6 @@
   protected MemoizingEvaluator memoizingEvaluator;
   private final MemoizingEvaluator.EmittedEventState emittedEventState =
       new MemoizingEvaluator.EmittedEventState();
-  protected final Reporter reporter;
   private final PackageFactory pkgFactory;
   private final WorkspaceStatusAction.Factory workspaceStatusActionFactory;
   private final BlazeDirectories directories;
@@ -272,7 +271,6 @@
       boolean errorOnExternalFiles) {
     // Strictly speaking, these arguments are not required for initialization, but all current
     // callsites have them at hand, so we might as well set them during construction.
-    this.reporter = Preconditions.checkNotNull(reporter);
     this.evaluatorSupplier = evaluatorSupplier;
     this.pkgFactory = pkgFactory;
     this.pkgFactory.setSyscalls(syscalls);
@@ -282,7 +280,7 @@
         new SkyframePackageLoader(), new SkyframeTransitivePackageLoader(),
         new SkyframeTargetPatternEvaluator(this), syscalls, cyclesReporter, pkgLocator,
         numPackagesLoaded, this);
-    this.errorEventListener = this.reporter;
+    this.errorEventListener = Preconditions.checkNotNull(reporter);
     this.resourceManager = ResourceManager.instance();
     this.skyframeActionExecutor = new SkyframeActionExecutor(reporter, resourceManager, eventBus,
         statusReporterRef);
@@ -341,7 +339,6 @@
     map.put(
         SkyFunctions.PACKAGE,
         newPackageFunction(
-            reporter,
             pkgFactory,
             packageManager,
             showLoadingProgress,
@@ -391,7 +388,6 @@
   }
 
   protected PackageFunction newPackageFunction(
-      Reporter reporter,
       PackageFactory pkgFactory,
       PackageManager packageManager,
       AtomicBoolean showLoadingProgress,
@@ -400,7 +396,6 @@
       AtomicInteger numPackagesLoaded,
       RuleClassProvider ruleClassProvider) {
     return new PackageFunction(
-        reporter,
         pkgFactory,
         packageManager,
         showLoadingProgress,
@@ -670,19 +665,20 @@
   }
 
   /** Returns the build-info.txt and build-changelist.txt artifacts. */
-  public Collection<Artifact> getWorkspaceStatusArtifacts() throws InterruptedException {
+  public Collection<Artifact> getWorkspaceStatusArtifacts(EventHandler eventHandler)
+      throws InterruptedException {
     // Should already be present, unless the user didn't request any targets for analysis.
     EvaluationResult<WorkspaceStatusValue> result = buildDriver.evaluate(
         ImmutableList.of(WorkspaceStatusValue.SKY_KEY), /*keepGoing=*/true, /*numThreads=*/1,
-        reporter);
+        eventHandler);
     WorkspaceStatusValue value =
         Preconditions.checkNotNull(result.get(WorkspaceStatusValue.SKY_KEY));
     return ImmutableList.of(value.getStableArtifact(), value.getVolatileArtifact());
   }
 
   // TODO(bazel-team): Make this take a PackageIdentifier.
-  public Map<PathFragment, Root> getArtifactRoots(Iterable<PathFragment> execPaths)
-      throws PackageRootResolutionException {
+  public Map<PathFragment, Root> getArtifactRoots(final EventHandler eventHandler,
+      Iterable<PathFragment> execPaths) throws PackageRootResolutionException {
     final List<SkyKey> packageKeys = new ArrayList<>();
     for (PathFragment execPath : execPaths) {
       Preconditions.checkArgument(!execPath.isAbsolute(), execPath);
@@ -697,7 +693,7 @@
         public EvaluationResult<ContainingPackageLookupValue> call() throws InterruptedException {
           synchronized (valueLookupLock) {
             return buildDriver.evaluate(
-                packageKeys, /*keepGoing=*/true, /*numThreads=*/1, reporter);
+                packageKeys, /*keepGoing=*/true, /*numThreads=*/1, eventHandler);
           }
         }
       });
@@ -740,10 +736,6 @@
     LOG.info(String.format("Found %d modified files from last build", modifiedFiles));
   }
 
-  public Reporter getReporter() {
-    return reporter;
-  }
-
   public EventBus getEventBus() {
     return eventBus.get();
   }
@@ -1308,8 +1300,8 @@
    * <p>May throw an {@link InterruptedException}, which means that no values have been invalidated.
    */
   @VisibleForTesting
-  public abstract void invalidateFilesUnderPathForTesting(ModifiedFileSet modifiedFileSet,
-      Path pathEntry) throws InterruptedException;
+  public abstract void invalidateFilesUnderPathForTesting(EventHandler eventHandler,
+      ModifiedFileSet modifiedFileSet, Path pathEntry) throws InterruptedException;
 
   /**
    * Invalidates SkyFrame values that may have failed for transient reasons.
@@ -1586,13 +1578,15 @@
   @ThreadCompatible
   public abstract void updateLoadedPackageSet(Set<PackageIdentifier> loadedPackages);
 
-  public void sync(PackageCacheOptions packageCacheOptions, Path outputBase, Path workingDirectory,
-      String defaultsPackageContents, UUID commandId) throws InterruptedException,
+  public void sync(EventHandler eventHandler, PackageCacheOptions packageCacheOptions,
+      Path outputBase, Path workingDirectory, String defaultsPackageContents, UUID commandId)
+          throws InterruptedException,
       AbruptExitException{
 
     preparePackageLoading(
         createPackageLocator(
-            packageCacheOptions, outputBase, directories.getWorkspace(), workingDirectory),
+            eventHandler, packageCacheOptions, outputBase, directories.getWorkspace(),
+            workingDirectory),
         packageCacheOptions.defaultVisibility, packageCacheOptions.showLoadingProgress,
         packageCacheOptions.globbingThreads, defaultsPackageContents, commandId);
     setDeletedPackages(ImmutableSet.copyOf(packageCacheOptions.deletedPackages));
@@ -1601,10 +1595,11 @@
     invalidateTransientErrors();
   }
 
-  protected PathPackageLocator createPackageLocator(PackageCacheOptions packageCacheOptions,
-      Path outputBase, Path workspace, Path workingDirectory) throws AbruptExitException {
+  protected PathPackageLocator createPackageLocator(EventHandler eventHandler,
+      PackageCacheOptions packageCacheOptions, Path outputBase, Path workspace,
+      Path workingDirectory) throws AbruptExitException {
     return PathPackageLocator.create(
-        outputBase, packageCacheOptions.packagePath, getReporter(), workspace, workingDirectory);
+        outputBase, packageCacheOptions.packagePath, eventHandler, workspace, workingDirectory);
   }
 
   private CyclesReporter createCyclesReporter() {