Only create -IA classes for nest host and use that for members as well

Bug: b/359546659
Change-Id: Ied2cd7791651860f8a5cda7dae1d819a78daae41
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fb052fb..fcd5428 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexMethod;
@@ -288,7 +289,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
@@ -722,7 +723,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index a4465a9..93b2f34 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.D8MethodProcessor;
@@ -109,7 +108,7 @@
               public void acceptNestConstructorBridge(
                   ProgramMethod target,
                   ProgramMethod bridge,
-                  DexProgramClass argumentClass,
+                  DexClass argumentClass,
                   DexClassAndMethod context) {
                 methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
               }
@@ -229,8 +228,7 @@
     private void ensureConstructorBridgeFromClasspathAccess(
         ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
       assert method.getDefinition().isInstanceInitializer();
-      DexProgramClass constructorArgumentClass =
-          ensureConstructorArgumentClass(method).asProgramClass();
+      DexClass constructorArgumentClass = ensureConstructorArgumentClass(method);
       DexMethod bridgeReference = getConstructorBridgeReference(method, constructorArgumentClass);
       synchronized (method.getHolder().getMethodCollection()) {
         if (method.getHolder().lookupMethod(bridgeReference) == null) {
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 10f3501..55221e7 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
@@ -232,7 +232,7 @@
                     : AccessBridgeFactory.createMethodAccessorBridge(
                         bridgeAndTarget.getBridge(), targetMethod, dexItemFactory));
     if (targetMethod.getDefinition().isInstanceInitializer()) {
-      DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass();
+      DexClass argumentClass = getConstructorArgumentClass(targetMethod);
       eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context);
     } else {
       eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context);
@@ -441,29 +441,35 @@
   }
 
   private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
-    return syntheticNestConstructorTypes.get(constructor.getHolderType());
+    return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
   }
 
   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(
-        constructor.getHolderType(),
+        hostType,
         holder -> {
-          if (constructor.isProgramMethod()) {
+          if (host.isProgramClass()) {
             return appView
                 .getSyntheticItems()
                 .createFixedClass(
                     kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    constructor.asProgramMethod().getHolder(),
+                    host.asProgramClass(),
                     appView,
                     builder -> {});
           } else {
-            assert constructor.isClasspathMethod();
+            assert host.isClasspathClass();
             return appView
                 .getSyntheticItems()
                 .ensureFixedClasspathClass(
                     kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    constructor.asClasspathMethod().getHolder(),
+                    host.asClasspathClass(),
                     appView,
                     ignored -> {},
                     ignored -> {});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
index afbeedc..8ec49e2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.ir.desugar.nest;
 
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 
@@ -14,7 +14,7 @@
   void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context);
 
   void acceptNestFieldGetBridge(
@@ -46,7 +46,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index b556923..3af5dc4 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexMethod;
@@ -292,7 +293,7 @@
   public void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context) {
     nestBasedAccessDesugaringEventConsumer.acceptNestConstructorBridge(
         target, bridge, argumentClass, context);
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
index 7d731fb..c44706f 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.profile.rewriting;
 
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaringEventConsumer;
@@ -38,12 +38,13 @@
   public void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context) {
     if (context.isProgramMethod()) {
       additionsCollection.applyIfContextIsInProfile(
           context.asProgramMethod(),
-          additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge));
+          additionsBuilder ->
+              additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge));
     } else {
       additionsCollection.accept(
           additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
index 0dec846..5e18f9c 100644
--- a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -45,7 +45,7 @@
         .inspect(
             inspector ->
                 assertEquals(
-                    5,
+                    1,
                     inspector.allClasses().stream()
                         .map(ClassSubject::getFinalName)
                         .filter(name -> name.endsWith("-IA"))
@@ -73,7 +73,7 @@
               .inspect(
                   inspector ->
                       assertEquals(
-                          1,
+                          0,
                           inspector.allClasses().stream()
                               .map(ClassSubject::getFinalName)
                               .filter(name -> name.endsWith("-IA"))
@@ -106,7 +106,7 @@
         .inspect(
             inspector ->
                 assertEquals(
-                    5,
+                    1,
                     inspector.allClasses().stream()
                         .map(ClassSubject::getFinalName)
                         .filter(name -> name.endsWith("-IA"))
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
index d2e3d0c..974683a 100644
--- a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
@@ -64,13 +64,13 @@
     inner.inspect(
         inspector -> {
           assertThisNumberOfBridges(inspector, 3);
-          assertNestConstructor(inspector);
+          assertNoNestConstructor(inspector);
         });
     D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost);
     host.inspect(
         inspector -> {
           assertThisNumberOfBridges(inspector, 1);
-          assertNestConstructor(inspector);
+          assertInitArgumentClass(inspector);
         });
   }
 
@@ -100,10 +100,14 @@
         .compile();
   }
 
-  private static void assertNestConstructor(CodeInspector inspector) {
+  private static void assertInitArgumentClass(CodeInspector inspector) {
     assertTrue(inspector.allClasses().stream().anyMatch(FoundClassSubject::isSynthetic));
   }
 
+  private static void assertNoNestConstructor(CodeInspector inspector) {
+    assertTrue(inspector.allClasses().stream().noneMatch(FoundClassSubject::isSynthetic));
+  }
+
   private static void assertThisNumberOfBridges(CodeInspector inspector, int numBridges) {
     for (FoundClassSubject clazz : inspector.allClasses()) {
       if (!clazz.isSynthetic()) {
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
index 3c7248a..b2ea090 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
@@ -91,9 +91,9 @@
             parameters.isCfRuntime(),
             result ->
                 result.assertSuccessWithOutputLines(
-                    "Outer$Inner-IA, 1",
-                    "int, Outer$Inner-IA, 2",
-                    "int, int, Outer$Inner-IA, 3",
+                    "Outer-IA, 1",
+                    "int, Outer-IA, 2",
+                    "int, int, Outer-IA, 3",
                     "int, int, 2",
                     "int, 1",
                     "0"),
@@ -102,9 +102,9 @@
                     "0",
                     "int, 1",
                     "int, int, 2",
-                    "int, int, Outer$Inner-IA, 3",
-                    "int, Outer$Inner-IA, 2",
-                    "Outer$Inner-IA, 1"));
+                    "int, int, Outer-IA, 3",
+                    "int, Outer-IA, 2",
+                    "Outer-IA, 1"));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
index 5756f2e..2b2d2f0 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -107,7 +107,6 @@
     inspect(
         profileInspector,
         inspector,
-        false,
         parameters.canUseNestBasedAccessesWhenDesugaring(),
         false);
   }
@@ -117,7 +116,6 @@
     inspect(
         profileInspector,
         inspector,
-        parameters.canHaveNonReboundConstructorInvoke(),
         parameters.canUseNestBasedAccesses(),
         true);
   }
@@ -125,7 +123,6 @@
   private void inspect(
       ArtProfileInspector profileInspector,
       CodeInspector inspector,
-      boolean canHaveNonReboundConstructorInvoke,
       boolean canUseNestBasedAccesses,
       boolean isR8)
       throws Exception {
@@ -135,7 +132,7 @@
     ClassSubject syntheticConstructorArgumentClassSubject =
         inspector.clazz(
             SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
-                Reference.classFromClass(NestMember.class)));
+                Reference.classFromClass(Main.class)));
     assertThat(
         syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));