Remove remaining reflection usage in compiledump

Bug: b/377606434
Change-Id: I2bfd766db01ea78305c1e90e80d2932e42de217b
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
index 684dab3..0cf82dc 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
@@ -7,32 +7,13 @@
 import com.android.tools.r8.BaseCompilerCommand;
 import com.android.tools.r8.utils.compiledump.ArtProfileDumpUtils;
 import java.io.IOException;
-import java.lang.reflect.Method;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.function.Consumer;
 
 public class CompileDumpBase {
 
-  static void setEnableExperimentalMissingLibraryApiModeling(
-      Object builder, boolean enableMissingLibraryApiModeling) {
-    getReflectiveBuilderMethod(
-            builder, "setEnableExperimentalMissingLibraryApiModeling", boolean.class)
-        .accept(new Object[] {enableMissingLibraryApiModeling});
-  }
-
-  static void setAndroidPlatformBuild(Object builder, boolean androidPlatformBuild) {
-    getReflectiveBuilderMethod(builder, "setAndroidPlatformBuild", boolean.class)
-        .accept(new Object[] {androidPlatformBuild});
-  }
-
-  static void setIsolatedSplits(Object builder, boolean isolatedSplits) {
-    getReflectiveBuilderMethod(builder, "setEnableIsolatedSplits", boolean.class)
-        .accept(new Object[] {isolatedSplits});
-  }
-
   static void addArtProfilesForRewriting(
       BaseCompilerCommand.Builder<?, ?> builder, Map<Path, Path> artProfileFiles) {
     for (Entry<Path, Path> inputOutput : artProfileFiles.entrySet()) {
@@ -44,24 +25,6 @@
     }
   }
 
-  static Consumer<Object[]> getReflectiveBuilderMethod(
-      Object builder, String setter, Class<?>... parameters) {
-    try {
-      Method declaredMethod = builder.getClass().getMethod(setter, parameters);
-      return args -> {
-        try {
-          declaredMethod.invoke(builder, args);
-        } catch (Exception e) {
-          throw new RuntimeException(e);
-        }
-      };
-    } catch (NoSuchMethodException e) {
-      System.out.println(setter + " is not available on the compiledump version.");
-      // The option is not available so we just return an empty consumer
-      return args -> {};
-    }
-  }
-
   @SuppressWarnings({"CatchAndPrintStackTrace", "DefaultCharset"})
   // We cannot use StringResource since this class is added to the class path and has access only
   // to the public APIs.
@@ -84,4 +47,20 @@
       System.out.println(onMissing);
     }
   }
+
+  protected static class BooleanBox {
+    public boolean value = false;
+
+    public BooleanBox(boolean value) {
+      this.value = value;
+    }
+
+    public void set(boolean value) {
+      this.value = value;
+    }
+
+    public boolean get() {
+      return value;
+    }
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
index d13ef27..ef8e947 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.utils.compiledump.CompilerCommandDumpUtils;
 import com.android.tools.r8.utils.compiledump.ResourceShrinkerDumpUtils;
 import com.android.tools.r8.utils.compiledump.StartupProfileDumpUtils;
 import java.nio.file.Path;
@@ -96,9 +97,9 @@
     Path androidResourcesOutput = null;
     int minApi = 1;
     int threads = -1;
-    boolean enableMissingLibraryApiModeling = false;
-    boolean androidPlatformBuild = false;
-    boolean isolatedSplits = false;
+    BooleanBox enableMissingLibraryApiModeling = new BooleanBox(false);
+    BooleanBox androidPlatformBuild = new BooleanBox(false);
+    BooleanBox isolatedSplits = new BooleanBox(false);
     for (int i = 0; i < args.length; i++) {
       String option = args[i];
       if (VALID_OPTIONS.contains(option)) {
@@ -124,13 +125,13 @@
               break;
             }
           case "--enable-missing-library-api-modeling":
-            enableMissingLibraryApiModeling = true;
+            enableMissingLibraryApiModeling.set(true);
             break;
           case "--android-platform-build":
-            androidPlatformBuild = true;
+            androidPlatformBuild.set(true);
             break;
           case ISOLATED_SPLITS_FLAG:
-            isolatedSplits = true;
+            isolatedSplits.set(true);
             break;
           default:
             throw new IllegalArgumentException("Unimplemented option: " + option);
@@ -244,9 +245,19 @@
           () -> StartupProfileDumpUtils.addStartupProfiles(startupProfileFiles, commandBuilder),
           "Could not add startup profiles.");
     }
-    setAndroidPlatformBuild(commandBuilder, androidPlatformBuild);
-    setIsolatedSplits(commandBuilder, isolatedSplits);
-    setEnableExperimentalMissingLibraryApiModeling(commandBuilder, enableMissingLibraryApiModeling);
+    runIgnoreMissing(
+        () ->
+            CompilerCommandDumpUtils.setAndroidPlatformBuild(
+                commandBuilder, androidPlatformBuild.get()),
+        "Android platform flag not available.");
+    runIgnoreMissing(
+        () -> CompilerCommandDumpUtils.setIsolatedSplits(commandBuilder, isolatedSplits.get()),
+        "Isolated splits flag not available.");
+    runIgnoreMissing(
+        () ->
+            CompilerCommandDumpUtils.setEnableExperimentalMissingLibraryApiModeling(
+                commandBuilder, enableMissingLibraryApiModeling.get()),
+        "Missing library api modeling not available.");
     if (desugaredLibJson != null) {
       commandBuilder.addDesugaredLibraryConfiguration(readAllBytesJava7(desugaredLibJson));
     }
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
index 27ee2f1..e9ce914 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpD8.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.utils.compiledump.CompilerCommandDumpUtils;
 import com.android.tools.r8.utils.compiledump.StartupProfileDumpUtils;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -72,8 +73,8 @@
     List<Path> startupProfileFiles = new ArrayList<>();
     int minApi = 1;
     int threads = -1;
-    boolean enableMissingLibraryApiModeling = false;
-    boolean androidPlatformBuild = false;
+    BooleanBox enableMissingLibraryApiModeling = new BooleanBox(false);
+    BooleanBox androidPlatformBuild = new BooleanBox(false);
     for (int i = 0; i < args.length; i++) {
       String option = args[i];
       if (VALID_OPTIONS.contains(option)) {
@@ -94,10 +95,10 @@
               break;
             }
           case "--enable-missing-library-api-modeling":
-            enableMissingLibraryApiModeling = true;
+            enableMissingLibraryApiModeling.set(true);
             break;
           case "--android-platform-build":
-            androidPlatformBuild = true;
+            androidPlatformBuild.set(true);
             break;
           default:
             throw new IllegalArgumentException("Unimplemented option: " + option);
@@ -183,8 +184,16 @@
           () -> StartupProfileDumpUtils.addStartupProfiles(startupProfileFiles, commandBuilder),
           "Could not add startup profiles.");
     }
-    setAndroidPlatformBuild(commandBuilder, androidPlatformBuild);
-    setEnableExperimentalMissingLibraryApiModeling(commandBuilder, enableMissingLibraryApiModeling);
+    runIgnoreMissing(
+        () ->
+            CompilerCommandDumpUtils.setAndroidPlatformBuild(
+                commandBuilder, androidPlatformBuild.get()),
+        "Android platform flag not available.");
+    runIgnoreMissing(
+        () ->
+            CompilerCommandDumpUtils.setEnableExperimentalMissingLibraryApiModeling(
+                commandBuilder, enableMissingLibraryApiModeling.get()),
+        "Missing library api modeling not available.");
     if (desugaredLibJson != null) {
       commandBuilder.addDesugaredLibraryConfiguration(readAllBytesJava7(desugaredLibJson));
     }
diff --git a/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java b/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java
new file mode 100644
index 0000000..3a7f051
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/compiledump/CompilerCommandDumpUtils.java
@@ -0,0 +1,35 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils.compiledump;
+
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.R8Command;
+
+// Simple boolean commands directly on compiler command builders
+public class CompilerCommandDumpUtils {
+  public static void setEnableExperimentalMissingLibraryApiModeling(
+      R8Command.Builder builder, boolean enable) {
+    builder.setEnableExperimentalMissingLibraryApiModeling(enable);
+  }
+
+  public static void setEnableExperimentalMissingLibraryApiModeling(
+      D8Command.Builder builder, boolean enable) {
+    builder.setEnableExperimentalMissingLibraryApiModeling(enable);
+  }
+
+  public static void setAndroidPlatformBuild(
+      R8Command.Builder builder, boolean androidPlatformBuild) {
+    builder.setAndroidPlatformBuild(androidPlatformBuild);
+  }
+
+  public static void setAndroidPlatformBuild(
+      D8Command.Builder builder, boolean androidPlatformBuild) {
+    builder.setAndroidPlatformBuild(androidPlatformBuild);
+  }
+
+  public static void setIsolatedSplits(R8Command.Builder builder, boolean isolatedSplits) {
+    builder.setEnableIsolatedSplits(isolatedSplits);
+  }
+}