Move class conflict resolver into internal options.

Bug: b/241063980
Change-Id: Ie3ff481895b8b09336f37defbc4782deb509c27f
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
index ad3bf13..e5447b3 100644
--- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
+++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -61,17 +61,14 @@
       D8Command command, Boolean minimalMainDex, Map<String, Integer> inputOrdering)
       throws CompilationFailedException {
     InternalOptions options = command.getInternalOptions();
+    options.programClassConflictResolver =
+        new DexFileMergerHelper(inputOrdering)::keepFirstProgramClassConflictResolver;
     ExceptionUtils.withD8CompilationHandler(
-        options.reporter,
-        () -> runInternal(command.getInputApp(), options, minimalMainDex, inputOrdering));
+        options.reporter, () -> runInternal(command.getInputApp(), options, minimalMainDex));
   }
 
   private static void runInternal(
-      AndroidApp inputApp,
-      InternalOptions options,
-      Boolean minimalMainDex,
-      Map<String, Integer> inputOrdering)
-      throws IOException {
+      AndroidApp inputApp, InternalOptions options, Boolean minimalMainDex) throws IOException {
     options.desugarState = DesugarState.OFF;
     options.enableMainDexListCheck = false;
     options.minimalMainDex = minimalMainDex;
@@ -84,11 +81,7 @@
       try {
         Timing timing = new Timing("DexFileMerger");
         ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
-        DexApplication app =
-            applicationReader.read(
-                null,
-                executor,
-                new DexFileMergerHelper(inputOrdering)::keepFirstProgramClassConflictResolver);
+        DexApplication app = applicationReader.read(null, executor);
 
         AppView<AppInfo> appView =
             AppView.createForD8(
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index e351e57..31967b1 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -46,7 +46,6 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.LibraryClassCollection;
 import com.android.tools.r8.utils.MainDexListParser;
-import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.StringDiagnostic;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
@@ -98,46 +97,25 @@
     }
   }
 
-  public final LazyLoadedDexApplication read(
-      ExecutorService executorService)
-      throws IOException {
-    return read(
-        inputApp.getProguardMapInputData(),
-        executorService,
-        ProgramClassCollection.defaultConflictResolver(options.reporter));
+  public final LazyLoadedDexApplication read(ExecutorService executorService) throws IOException {
+    return read(inputApp.getProguardMapInputData(), executorService);
   }
 
   public final LazyLoadedDexApplication readWithoutDumping(ExecutorService executorService)
       throws IOException {
-    return read(
-        inputApp.getProguardMapInputData(),
-        executorService,
-        ProgramClassCollection.defaultConflictResolver(options.reporter),
-        DumpInputFlags.noDump());
+    return read(inputApp.getProguardMapInputData(), executorService, DumpInputFlags.noDump());
   }
 
   public final LazyLoadedDexApplication read(
       StringResource proguardMap,
       ExecutorService executorService)
       throws IOException {
-    return read(
-        proguardMap,
-        executorService,
-        ProgramClassCollection.defaultConflictResolver(options.reporter));
+    return read(proguardMap, executorService, options.getDumpInputFlags());
   }
 
   public final LazyLoadedDexApplication read(
       StringResource proguardMap,
       ExecutorService executorService,
-      ProgramClassConflictResolver resolver)
-      throws IOException {
-    return read(proguardMap, executorService, resolver, options.getDumpInputFlags());
-  }
-
-  public final LazyLoadedDexApplication read(
-      StringResource proguardMap,
-      ExecutorService executorService,
-      ProgramClassConflictResolver resolver,
       DumpInputFlags dumpInputFlags)
       throws IOException {
     assert verifyMainDexOptionsCompatible(inputApp, options);
@@ -148,8 +126,7 @@
     }
 
     timing.begin("DexApplication.read");
-    final LazyLoadedDexApplication.Builder builder =
-        DexApplication.builder(options, timing, resolver);
+    final LazyLoadedDexApplication.Builder builder = DexApplication.builder(options, timing);
     try {
       List<Future<?>> futures = new ArrayList<>();
       // Still preload some of the classes, primarily for two reasons:
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index 5dd4a97..49bfc86 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -7,12 +7,10 @@
 package com.android.tools.r8.graph;
 
 import com.android.tools.r8.DataResourceProvider;
-import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.synthesis.SyntheticDefinitionsProvider;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.Timing;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
@@ -265,13 +263,7 @@
   }
 
   public static LazyLoadedDexApplication.Builder builder(InternalOptions options, Timing timing) {
-    return builder(
-        options, timing, ProgramClassCollection.defaultConflictResolver(options.reporter));
-  }
-
-  public static LazyLoadedDexApplication.Builder builder(
-      InternalOptions options, Timing timing, ProgramClassConflictResolver resolver) {
-    return new LazyLoadedDexApplication.Builder(resolver, options, timing);
+    return new LazyLoadedDexApplication.Builder(options, timing);
   }
 
   public DirectMappedDexApplication asDirect() {
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index 584729a..80bb4cf 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -271,18 +271,15 @@
 
     private ClasspathClassCollection classpathClasses;
     private LibraryClassCollection libraryClasses;
-    private final ProgramClassConflictResolver resolver;
 
-    Builder(ProgramClassConflictResolver resolver, InternalOptions options, Timing timing) {
+    Builder(InternalOptions options, Timing timing) {
       super(options, timing);
-      this.resolver = resolver;
       this.classpathClasses = ClasspathClassCollection.empty();
       this.libraryClasses = null;
     }
 
     private Builder(LazyLoadedDexApplication application) {
       super(application);
-      this.resolver = ProgramClassCollection.defaultConflictResolver(application.options.reporter);
       this.classpathClasses = application.classpathClasses;
       this.libraryClasses = application.libraryClasses;
     }
@@ -311,6 +308,10 @@
 
     @Override
     public LazyLoadedDexApplication build() {
+      ProgramClassConflictResolver resolver =
+          options.programClassConflictResolver == null
+              ? ProgramClassCollection.defaultConflictResolver(options.reporter)
+              : options.programClassConflictResolver;
       return new LazyLoadedDexApplication(
           proguardMap,
           flags,
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 71260a7..1ffb413 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -23,6 +23,7 @@
 import com.android.tools.r8.androidapi.ComputedApiLevel;
 import com.android.tools.r8.cf.CfVersion;
 import com.android.tools.r8.debuginfo.DebugRepresentation;
+import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.dex.Marker.Tool;
@@ -170,6 +171,8 @@
   // TODO(zerny): Make this private-final once we have full program-consumer support.
   public ProgramConsumer programConsumer = null;
 
+  public ProgramClassConflictResolver programClassConflictResolver = null;
+
   private GlobalSyntheticsConsumer globalSyntheticsConsumer = null;
 
   public DataResourceConsumer dataResourceConsumer;