Add temporary flag for best desugaring -IA classes generation

Bug: b/359546659
Change-Id: Ib9f0152eddac3259b5c47873ea7c4d72b5ef9e8b
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 55221e7..0550d47 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -441,40 +441,70 @@
   }
 
   private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
-    return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
+    if (!appView.options().legacyNestDesugaringIAClasses) {
+      return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
+    } else {
+      return syntheticNestConstructorTypes.get(constructor.getHolderType());
+    }
   }
 
   DexClass ensureConstructorArgumentClass(DexClassAndMethod constructor) {
     assert constructor.getDefinition().isInstanceInitializer();
     assert constructor.isProgramMethod() || constructor.isClasspathMethod();
-    DexType hostType =
-        constructor.isProgramMethod()
-            ? constructor.asProgramMethod().getHolder().getNestHost()
-            : constructor.asClasspathMethod().getHolder().getNestHost();
-    DexClass host = appView.definitionFor(hostType);
-    return syntheticNestConstructorTypes.computeIfAbsent(
-        hostType,
-        holder -> {
-          if (host.isProgramClass()) {
-            return appView
-                .getSyntheticItems()
-                .createFixedClass(
-                    kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    host.asProgramClass(),
-                    appView,
-                    builder -> {});
-          } else {
-            assert host.isClasspathClass();
-            return appView
-                .getSyntheticItems()
-                .ensureFixedClasspathClass(
-                    kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    host.asClasspathClass(),
-                    appView,
-                    ignored -> {},
-                    ignored -> {});
-          }
-        });
+    if (!appView.options().legacyNestDesugaringIAClasses) {
+      DexType hostType =
+          constructor.isProgramMethod()
+              ? constructor.asProgramMethod().getHolder().getNestHost()
+              : constructor.asClasspathMethod().getHolder().getNestHost();
+      DexClass host = appView.definitionFor(hostType);
+      return syntheticNestConstructorTypes.computeIfAbsent(
+          hostType,
+          holder -> {
+            if (host.isProgramClass()) {
+              return appView
+                  .getSyntheticItems()
+                  .createFixedClass(
+                      kinds -> kinds.INIT_TYPE_ARGUMENT,
+                      host.asProgramClass(),
+                      appView,
+                      builder -> {});
+            } else {
+              assert host.isClasspathClass();
+              return appView
+                  .getSyntheticItems()
+                  .ensureFixedClasspathClass(
+                      kinds -> kinds.INIT_TYPE_ARGUMENT,
+                      host.asClasspathClass(),
+                      appView,
+                      ignored -> {},
+                      ignored -> {});
+            }
+          });
+    } else {
+      return syntheticNestConstructorTypes.computeIfAbsent(
+          constructor.getHolderType(),
+          holder -> {
+            if (constructor.isProgramMethod()) {
+              return appView
+                  .getSyntheticItems()
+                  .createFixedClass(
+                      kinds -> kinds.INIT_TYPE_ARGUMENT,
+                      constructor.asProgramMethod().getHolder(),
+                      appView,
+                      builder -> {});
+            } else {
+              assert constructor.isClasspathMethod();
+              return appView
+                  .getSyntheticItems()
+                  .ensureFixedClasspathClass(
+                      kinds -> kinds.INIT_TYPE_ARGUMENT,
+                      constructor.asClasspathMethod().getHolder(),
+                      appView,
+                      ignored -> {},
+                      ignored -> {});
+            }
+          });
+    }
   }
 
   DexMethod getConstructorBridgeReference(
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 3146c85..dac665d 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -523,6 +523,10 @@
   // Flag to allow force nest desugaring, even if natively supported on the chosen API level.
   public boolean forceNestDesugaring =
       System.getProperty("com.android.tools.r8.forceNestDesugaring") != null;
+  // Flag to use legacy generation of -IA classes for nests (only for Platform until aosp/3241282
+  // lands).
+  public boolean legacyNestDesugaringIAClasses =
+      System.getProperty("com.android.tools.r8.legacyNestDesugaringIAClasses") != null;
 
   // TODO(b/293591931): Remove this flag.
   // Flag to allow permitted subclasses annotations in DEX. See b/231930852 for context.
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
index 5e18f9c..2de3600 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -29,10 +29,15 @@
   @Parameter(1)
   public boolean intermediate;
 
-  @Parameters(name = "{0}, intermediate = {1}")
+  @Parameter(2)
+  public boolean legacyNestDesugaringIAClasses;
+
+  @Parameters(name = "{0}, intermediate = {1}, legacyNestDesugaringIAClasses = {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntimesAndAllApiLevels().build(), BooleanUtils.values());
+        getTestParameters().withDexRuntimesAndAllApiLevels().build(),
+        BooleanUtils.values(),
+        BooleanUtils.values());
   }
 
   @Test
@@ -41,11 +46,13 @@
         .addProgramClassesAndInnerClasses(NestInitArgumentContextClass.class)
         .setMinApi(parameters)
         .setIntermediate(intermediate)
+        .addOptionsModification(
+            options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
         .compile()
         .inspect(
             inspector ->
                 assertEquals(
-                    1,
+                    legacyNestDesugaringIAClasses ? 5 : 1,
                     inspector.allClasses().stream()
                         .map(ClassSubject::getFinalName)
                         .filter(name -> name.endsWith("-IA"))
@@ -69,11 +76,13 @@
               .addClasspathClasses(innerClasses)
               .setMinApi(parameters)
               .setIntermediate(intermediate)
+              .addOptionsModification(
+                  options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
               .compile()
               .inspect(
                   inspector ->
                       assertEquals(
-                          0,
+                          legacyNestDesugaringIAClasses ? 1 : 0,
                           inspector.allClasses().stream()
                               .map(ClassSubject::getFinalName)
                               .filter(name -> name.endsWith("-IA"))
@@ -87,6 +96,8 @@
             .addClasspathClasses(innerClasses)
             .setMinApi(parameters)
             .setIntermediate(intermediate)
+            .addOptionsModification(
+                options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
             .compile()
             .inspect(
                 inspector ->
@@ -102,11 +113,13 @@
         .addProgramFiles(innerClassesCompiled)
         .addProgramFiles(outerClassCompiled)
         .setMinApi(parameters)
+        .addOptionsModification(
+            options -> options.legacyNestDesugaringIAClasses = legacyNestDesugaringIAClasses)
         .compile()
         .inspect(
             inspector ->
                 assertEquals(
-                    1,
+                    legacyNestDesugaringIAClasses ? 5 : 1,
                     inspector.allClasses().stream()
                         .map(ClassSubject::getFinalName)
                         .filter(name -> name.endsWith("-IA"))