Remove options class parameters from `SkyframeExecutor` sync methods - an `OptionsProvider` is already passed in, and it's confusing that some tests have conflicting options in the raw parameter vs the provider.

Tests make use of the very useful `FakeOptions` test utility.

Also remove `syncPackageLoadingInternal` in favor of calling `super`.

PiperOrigin-RevId: 441799752
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 08cd449..2b0fdaa 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
@@ -30,7 +30,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.exec.SingleBuildFileCache;
-import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.pkgcache.PackageManager;
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
@@ -697,9 +696,7 @@
         getSkyframeExecutor()
             .sync(
                 reporter,
-                options.getOptions(PackageOptions.class),
                 packageLocator,
-                options.getOptions(BuildLanguageOptions.class),
                 getCommandId(),
                 clientEnv,
                 repoEnvFromOptions,
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 511a686..6bada69 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
@@ -19,6 +19,8 @@
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
+import com.google.common.collect.ClassToInstanceMap;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -57,7 +59,6 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.WorkspaceFileValue;
 import com.google.devtools.build.lib.packages.WorkspaceFileValue.WorkspaceFileKey;
-import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions;
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.profiler.Profiler;
@@ -105,6 +106,8 @@
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
+import com.google.devtools.common.options.Options;
+import com.google.devtools.common.options.OptionsBase;
 import com.google.devtools.common.options.OptionsProvider;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -260,9 +263,7 @@
   @Override
   public WorkspaceInfoFromDiff sync(
       ExtendedEventHandler eventHandler,
-      PackageOptions packageOptions,
       PathPackageLocator packageLocator,
-      BuildLanguageOptions buildLanguageOptions,
       UUID commandId,
       Map<String, String> clientEnv,
       Map<String, String> repoEnvOption,
@@ -277,21 +278,14 @@
     }
     super.sync(
         eventHandler,
-        packageOptions,
         packageLocator,
-        buildLanguageOptions,
         commandId,
         clientEnv,
         repoEnvOption,
         tsgm,
         options);
     long startTime = System.nanoTime();
-    RepositoryOptions repoOptions = options.getOptions(RepositoryOptions.class);
-    boolean checkExternalRepositoryFiles =
-        repoOptions == null || repoOptions.checkExternalRepositoryFiles;
-    WorkspaceInfoFromDiff workspaceInfo =
-        handleDiffs(
-            eventHandler, packageOptions.checkOutputFiles, checkExternalRepositoryFiles, options);
+    WorkspaceInfoFromDiff workspaceInfo = handleDiffs(eventHandler, options);
     long stopTime = System.nanoTime();
     Profiler.instance().logSimpleTask(startTime, stopTime, ProfilerTask.INFO, "handleDiffs");
     long duration = stopTime - startTime;
@@ -344,24 +338,35 @@
   @VisibleForTesting
   public void handleDiffsForTesting(ExtendedEventHandler eventHandler)
       throws InterruptedException, AbruptExitException {
-    if (super.lastAnalysisDiscarded) {
+    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(eventHandler);
-      super.lastAnalysisDiscarded = false;
+      lastAnalysisDiscarded = false;
     }
+    PackageOptions packageOptions = Options.getDefaults(PackageOptions.class);
+    packageOptions.checkOutputFiles = false;
+    ClassToInstanceMap<OptionsBase> options =
+        ImmutableClassToInstanceMap.of(PackageOptions.class, packageOptions);
     handleDiffs(
         eventHandler,
-        /*checkOutputFiles=*/ false,
-        /*checkExternalRepositoryFiles=*/ true,
-        OptionsProvider.EMPTY);
+        new OptionsProvider() {
+          @Nullable
+          @Override
+          public <O extends OptionsBase> O getOptions(Class<O> optionsClass) {
+            return options.getInstance(optionsClass);
+          }
+
+          @Override
+          public ImmutableMap<String, Object> getStarlarkOptions() {
+            return ImmutableMap.of();
+          }
+        });
   }
 
   @Nullable
   private WorkspaceInfoFromDiff handleDiffs(
       ExtendedEventHandler eventHandler,
-      boolean checkOutputFiles,
-      boolean checkExternalRepositoryFiles,
       OptionsProvider options)
       throws InterruptedException, AbruptExitException {
     TimestampGranularityMonitor tsgm = this.tsgm.get();
@@ -398,17 +403,16 @@
       }
     }
     BuildRequestOptions buildRequestOptions = options.getOptions(BuildRequestOptions.class);
-    // TODO(bazel-team): Should use --experimental_fsvc_threads instead of the hardcoded constant
-    // but plumbing the flag through is hard.
     int fsvcThreads = buildRequestOptions == null ? 200 : buildRequestOptions.fsvcThreads;
     handleDiffsWithCompleteDiffInformation(
         tsgm, modifiedFilesByPathEntry, managedDirectoriesChanged, fsvcThreads);
+    RepositoryOptions repoOptions = options.getOptions(RepositoryOptions.class);
     handleDiffsWithMissingDiffInformation(
         eventHandler,
         tsgm,
         pathEntriesWithoutDiffInformation,
-        checkOutputFiles,
-        checkExternalRepositoryFiles,
+        options.getOptions(PackageOptions.class).checkOutputFiles,
+        repoOptions == null || repoOptions.checkExternalRepositoryFiles,
         managedDirectoriesChanged,
         fsvcThreads);
     handleClientEnvironmentChanges();
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 954ac1c..9aec4a6 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
@@ -2697,6 +2697,9 @@
   /**
    * Initializes and syncs the graph with the given options, readying it for the next evaluation.
    *
+   * <p>At a minimum, {@link PackageOptions} and {@link BuildLanguageOptions} are expected to be
+   * present in the given {@link OptionsProvider}.
+   *
    * <p>Returns precomputed information about the workspace if it is available at this stage. This
    * is an optimization allowing implementations which have such information to make it available
    * early in the build.
@@ -2704,9 +2707,7 @@
   @Nullable
   public WorkspaceInfoFromDiff sync(
       ExtendedEventHandler eventHandler,
-      PackageOptions packageOptions,
       PathPackageLocator pathPackageLocator,
-      BuildLanguageOptions buildLanguageOptions,
       UUID commandId,
       Map<String, String> clientEnv,
       Map<String, String> repoEnvOption,
@@ -2721,14 +2722,7 @@
     AnalysisOptions analysisOptions = options.getOptions(AnalysisOptions.class);
     keepBuildConfigurationNodesWhenDiscardingAnalysis =
         analysisOptions == null || analysisOptions.keepConfigNodes;
-    syncPackageLoading(
-        packageOptions,
-        pathPackageLocator,
-        buildLanguageOptions,
-        commandId,
-        clientEnv,
-        tsgm,
-        options);
+    syncPackageLoading(pathPackageLocator, commandId, clientEnv, tsgm, options);
 
     if (lastAnalysisDiscarded) {
       dropConfiguredTargetsNow(eventHandler);
@@ -2754,28 +2748,21 @@
   }
 
   protected void syncPackageLoading(
-      PackageOptions packageOptions,
       PathPackageLocator pathPackageLocator,
-      BuildLanguageOptions buildLanguageOptions,
       UUID commandId,
       Map<String, String> clientEnv,
       TimestampGranularityMonitor tsgm,
       OptionsProvider options)
       throws AbruptExitException {
-    syncPackageLoadingInternal(
-        packageOptions, pathPackageLocator, buildLanguageOptions, commandId, clientEnv, tsgm);
-  }
-
-  protected final void syncPackageLoadingInternal(
-      PackageOptions packageOptions,
-      PathPackageLocator pathPackageLocator,
-      BuildLanguageOptions buildLanguageOptions,
-      UUID commandId,
-      Map<String, String> clientEnv,
-      TimestampGranularityMonitor tsgm) {
+    PackageOptions packageOptions = options.getOptions(PackageOptions.class);
     try (SilentCloseable c = Profiler.instance().profile("preparePackageLoading")) {
       preparePackageLoading(
-          pathPackageLocator, packageOptions, buildLanguageOptions, commandId, clientEnv, tsgm);
+          pathPackageLocator,
+          packageOptions,
+          options.getOptions(BuildLanguageOptions.class),
+          commandId,
+          clientEnv,
+          tsgm);
     }
     try (SilentCloseable c = Profiler.instance().profile("setDeletedPackages")) {
       setDeletedPackages(packageOptions.getDeletedPackages());
diff --git a/src/test/java/com/google/devtools/build/lib/query2/testutil/BUILD b/src/test/java/com/google/devtools/build/lib/query2/testutil/BUILD
index b2fed83..447e862 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/testutil/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/query2/testutil/BUILD
@@ -41,6 +41,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe:package_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
+        "//src/main/java/com/google/devtools/build/lib/testing/common:fake-options",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
         "//src/main/java/com/google/devtools/build/lib/util:filetype",
         "//src/main/java/com/google/devtools/build/lib/util/io",
diff --git a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
index 663ea39..cfd4b76 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
@@ -57,6 +57,7 @@
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.SkyframeTargetPatternEvaluator;
+import com.google.devtools.build.lib.testing.common.FakeOptions;
 import com.google.devtools.build.lib.testutil.SkyframeExecutorTestHelper;
 import com.google.devtools.build.lib.testutil.TestPackageFactoryBuilderFactory;
 import com.google.devtools.build.lib.util.AbruptExitException;
@@ -72,7 +73,6 @@
 import com.google.devtools.build.skyframe.MemoizingEvaluator;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.common.options.Options;
-import com.google.devtools.common.options.OptionsProvider;
 import com.google.errorprone.annotations.ForOverride;
 import java.io.IOException;
 import java.util.AbstractSet;
@@ -254,7 +254,7 @@
   public Set<Target> evaluateQueryRaw(String query) throws QueryException, InterruptedException {
     Set<Target> result = new LinkedHashSet<>();
     ThreadSafeOutputFormatterCallback<Target> callback =
-        new ThreadSafeOutputFormatterCallback<Target>() {
+        new ThreadSafeOutputFormatterCallback<>() {
           @Override
           public synchronized void processOutput(Iterable<Target> partialResult) {
             Iterables.addAll(result, partialResult);
@@ -299,14 +299,15 @@
     try {
       skyframeExecutor.sync(
           getReporter(),
-          packageOptions,
           packageLocator,
-          Options.getDefaults(BuildLanguageOptions.class),
           UUID.randomUUID(),
           ImmutableMap.of(),
           ImmutableMap.of(),
           new TimestampGranularityMonitor(BlazeClock.instance()),
-          OptionsProvider.EMPTY);
+          FakeOptions.builder()
+              .put(packageOptions)
+              .putDefaults(BuildLanguageOptions.class)
+              .build());
     } catch (InterruptedException | AbruptExitException e) {
       throw new IllegalStateException(e);
     }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
index 9f592a5..ae9a0df 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/AbstractCollectPackagesUnderDirectoryTest.java
@@ -33,6 +33,7 @@
 import com.google.devtools.build.lib.pkgcache.PackageOptions;
 import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
+import com.google.devtools.build.lib.testing.common.FakeOptions;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestPackageFactoryBuilderFactory;
@@ -54,7 +55,6 @@
 import com.google.devtools.build.skyframe.SkyFunctionName;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.common.options.Options;
-import com.google.devtools.common.options.OptionsProvider;
 import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
@@ -310,14 +310,12 @@
             PrecomputedValue.injected(RepositoryDelegatorFunction.ENABLE_BZLMOD, false)));
     skyframeExecutor.sync(
         reporter,
-        packageOptions,
         pathPackageLocator,
-        Options.getDefaults(BuildLanguageOptions.class),
         UUID.randomUUID(),
         /*clientEnv=*/ ImmutableMap.of(),
         /*repoEnvOption=*/ ImmutableMap.of(),
         new TimestampGranularityMonitor(BlazeClock.instance()),
-        OptionsProvider.EMPTY);
+        FakeOptions.builder().put(packageOptions).putDefaults(BuildLanguageOptions.class).build());
     evaluator = skyframeExecutor.getEvaluator();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index bf142bc..5b1fdd1 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -94,7 +94,6 @@
     deps = select({
         "//src/conditions:darwin": [
             "//src/main/java/com/google/devtools/build/lib/skyframe:local_diff_awareness",
-            "//src/main/java/com/google/devtools/build/lib/testing/common:fake-options",
         ],
         "//conditions:default": [],
     }) + [
@@ -294,6 +293,7 @@
         "//src/test/java/com/google/devtools/build/lib/events:testutil",
         "//src/test/java/com/google/devtools/build/lib/packages:testutil",
         "//src/test/java/com/google/devtools/build/lib/rules/platform:testutil",
+        "//src/main/java/com/google/devtools/build/lib/testing/common:fake-options",
         "//src/test/java/com/google/devtools/build/lib/testutil",
         "//src/test/java/com/google/devtools/build/lib/testutil:JunitUtils",
         "//src/test/java/com/google/devtools/build/lib/testutil:SkyframeExecutorTestHelper",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index 4324ffc..e836283 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -110,9 +110,9 @@
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.TestUtils;
+import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
 import com.google.devtools.build.lib.util.DetailedExitCode;
 import com.google.devtools.build.lib.util.Fingerprint;
@@ -136,7 +136,6 @@
 import com.google.devtools.build.skyframe.TaggedEvents;
 import com.google.devtools.build.skyframe.TrackingAwaiter;
 import com.google.devtools.build.skyframe.ValueWithMetadata;
-import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsParser;
 import com.google.devtools.common.options.OptionsProvider;
 import com.google.protobuf.CodedInputStream;
@@ -189,11 +188,12 @@
     options =
         OptionsParser.builder()
             .optionsClasses(
-                ImmutableList.of(
-                    KeepGoingOption.class,
-                    BuildRequestOptions.class,
-                    AnalysisOptions.class,
-                    CoreOptions.class))
+                AnalysisOptions.class,
+                BuildLanguageOptions.class,
+                BuildRequestOptions.class,
+                CoreOptions.class,
+                KeepGoingOption.class,
+                PackageOptions.class)
             .build();
     options.parse("--jobs=20");
   }
@@ -306,16 +306,7 @@
     skyframeExecutor.handleDiffsForTesting(NullEventHandler.INSTANCE);
     scratch.overwriteFile("/external/file", "new content");
 
-    skyframeExecutor.sync(
-        NullEventHandler.INSTANCE,
-        Options.getDefaults(PackageOptions.class),
-        skyframeExecutor.getPackageLocator().get(),
-        Options.getDefaults(BuildLanguageOptions.class),
-        UUID.randomUUID(),
-        /*clientEnv=*/ ImmutableMap.of(),
-        /*repoEnvOption=*/ ImmutableMap.of(),
-        new TimestampGranularityMonitor(new ManualClock()),
-        options);
+    syncSkyframeExecutor();
 
     Diff diff = getRecordedDiff();
     assertThat(diff.changedKeysWithNewValues()).containsKey(file);
@@ -334,16 +325,7 @@
     // Initial sync to establish the baseline DiffAwareness.View.
     skyframeExecutor.handleDiffsForTesting(NullEventHandler.INSTANCE);
 
-    skyframeExecutor.sync(
-        NullEventHandler.INSTANCE,
-        Options.getDefaults(PackageOptions.class),
-        skyframeExecutor.getPackageLocator().get(),
-        Options.getDefaults(BuildLanguageOptions.class),
-        UUID.randomUUID(),
-        /*clientEnv=*/ ImmutableMap.of(),
-        /*repoEnvOption=*/ ImmutableMap.of(),
-        new TimestampGranularityMonitor(new ManualClock()),
-        options);
+    syncSkyframeExecutor();
 
     Diff diff = getRecordedDiff();
     assertThat(diff.changedKeysWithoutNewValues()).doesNotContain(file);
@@ -372,16 +354,7 @@
     skyframeExecutor.handleDiffsForTesting(NullEventHandler.INSTANCE);
     scratch.file("/external/foo/new_file");
 
-    skyframeExecutor.sync(
-        NullEventHandler.INSTANCE,
-        Options.getDefaults(PackageOptions.class),
-        skyframeExecutor.getPackageLocator().get(),
-        Options.getDefaults(BuildLanguageOptions.class),
-        UUID.randomUUID(),
-        /*clientEnv=*/ ImmutableMap.of(),
-        /*repoEnvOption=*/ ImmutableMap.of(),
-        new TimestampGranularityMonitor(new ManualClock()),
-        options);
+    syncSkyframeExecutor();
 
     Diff diff = getRecordedDiff();
     assertThat(diff.changedKeysWithoutNewValues()).containsNoneOf(dir, dirListingKey);
@@ -411,16 +384,7 @@
     // Initial sync to establish the baseline DiffAwareness.View.
     skyframeExecutor.handleDiffsForTesting(NullEventHandler.INSTANCE);
 
-    skyframeExecutor.sync(
-        NullEventHandler.INSTANCE,
-        Options.getDefaults(PackageOptions.class),
-        skyframeExecutor.getPackageLocator().get(),
-        Options.getDefaults(BuildLanguageOptions.class),
-        UUID.randomUUID(),
-        /*clientEnv=*/ ImmutableMap.of(),
-        /*repoEnvOption=*/ ImmutableMap.of(),
-        new TimestampGranularityMonitor(new ManualClock()),
-        options);
+    syncSkyframeExecutor();
 
     Diff diff = getRecordedDiff();
     assertThat(diff.changedKeysWithoutNewValues()).containsNoneOf(dir, dirListingKey);
@@ -1388,7 +1352,7 @@
    * even if "top" is delayed to wait for the shared action2 to run, the assertion that the artifact
    * exists will fail, since action2's "prepare" step deleted it.
    */
-  @Ignore
+  @Ignore("b/150153544")
   @Test
   public void incrementalSharedActions() throws Exception {
     Path root = getExecRoot();
@@ -2490,4 +2454,15 @@
     MoreAsserts.assertNotContainsEvent(
         eventCollector, Pattern.compile(".*after scanning.*\n.*Scanning.*\n.*Test dir/top.*"));
   }
+
+  private void syncSkyframeExecutor() throws AbruptExitException, InterruptedException {
+    skyframeExecutor.sync(
+        reporter,
+        skyframeExecutor.getPackageLocator().get(),
+        UUID.randomUUID(),
+        /*clientEnv=*/ ImmutableMap.of(),
+        /*repoEnvOption=*/ ImmutableMap.of(),
+        new TimestampGranularityMonitor(BlazeClock.instance()),
+        options);
+  }
 }