Enable minimal synthetic names in D8 intermediate tests

Bug: b/185560004
Change-Id: I11c022296cd56ec6db690412a6c842b0e4592621
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
index cddae05..36729e5 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinition.java
@@ -75,7 +75,8 @@
       // name back to the original context.
       return context.getSynthesizingContextType().toBinaryName();
     }
-    return SyntheticNaming.getPrefixForExternalSyntheticType(getKind(), getHolder().getType());
+    return SyntheticNaming.getPrefixForExternalSyntheticType(
+        getKind(), getHolder().getType(), appView);
   }
 
   public abstract C getHolder();
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index a6d7112..0f2f5e6 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -336,7 +336,8 @@
             return;
           }
           String prefix =
-              SyntheticNaming.getPrefixForExternalSyntheticType(item.getKind(), item.getHolder());
+              SyntheticNaming.getPrefixForExternalSyntheticType(
+                  item.getKind(), item.getHolder(), appView);
           assert !prefix.contains(SyntheticNaming.getPhaseSeparator(Phase.INTERNAL));
           DexType context =
               appView
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 406c2de..a98b37f 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -603,8 +603,11 @@
   }
 
   boolean isSyntheticInput(DexProgramClass clazz) {
-    return committed.containsSyntheticInput(clazz.getType())
-        || finalized.containsSyntheticInput(clazz.getType());
+    return isSyntheticInput(clazz.getType());
+  }
+
+  boolean isSyntheticInput(DexType type) {
+    return committed.containsSyntheticInput(type) || finalized.containsSyntheticInput(type);
   }
 
   public FeatureSplit getContextualFeatureSplitOrDefault(DexType type, FeatureSplit defaultValue) {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
index 7670696..a2e13b6 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMarker.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.graph.DexAnnotation.SynthesizedAnnotationClassInfo;
 import com.android.tools.r8.graph.DexAnnotationSet;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
@@ -131,8 +130,7 @@
         return NO_MARKER;
       }
       assert marker.getContext() == null;
-      DexType contextType =
-          getSyntheticContextType(clazz.type, marker.kind, appView.dexItemFactory());
+      DexType contextType = getSyntheticContextType(clazz.type, marker.kind, appView);
       SynthesizingContext context =
           SynthesizingContext.fromSyntheticInputClass(clazz, contextType, appView);
       return new SyntheticMarker(marker.kind, context);
@@ -175,7 +173,7 @@
     }
     clazz.setAnnotations(DexAnnotationSet.empty());
     clazz.forEachMethod(method -> method.setApiLevelForCode(synthesizedInfo.getComputedApiLevel()));
-    DexType context = getSyntheticContextType(clazz.type, kind, appView.dexItemFactory());
+    DexType context = getSyntheticContextType(clazz.type, kind, appView);
     return new SyntheticMarker(
         kind, SynthesizingContext.fromSyntheticInputClass(clazz, context, appView));
   }
@@ -187,12 +185,15 @@
   }
 
   private static DexType getSyntheticContextType(
-      DexType type, SyntheticKind kind, DexItemFactory factory) {
+      DexType type, SyntheticKind kind, AppView<?> appView) {
     if (kind.isGlobal()) {
       return type;
     }
-    String prefix = SyntheticNaming.getOuterContextFromExternalSyntheticType(kind, type);
-    return factory.createType(DescriptorUtils.getDescriptorFromClassBinaryName(prefix));
+    String prefix =
+        SyntheticNaming.getOuterContextFromExternalSyntheticType(kind, type, appView.options());
+    return appView
+        .dexItemFactory()
+        .createType(DescriptorUtils.getDescriptorFromClassBinaryName(prefix));
   }
 
   private static final SyntheticMarker NO_MARKER = new SyntheticMarker(null, null);
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index fbc5471..3f6f217 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -436,28 +436,43 @@
   /** Method name when generating synthetic methods in a class. */
   static final String INTERNAL_SYNTHETIC_METHOD_NAME = "m";
 
-  static String getPrefixForExternalSyntheticType(SyntheticKind kind, DexType type) {
+  static String getPrefixForExternalSyntheticType(
+      SyntheticKind kind, DexType type, AppView<?> appView) {
     String binaryName = type.toBinaryName();
     if (kind.isGlobal()) {
       return binaryName;
     }
-    int index =
-        binaryName.lastIndexOf(
-            kind.isFixedSuffixSynthetic() ? kind.descriptor : SYNTHETIC_CLASS_SEPARATOR);
+    int index;
+    if (kind.isFixedSuffixSynthetic()) {
+      index = binaryName.lastIndexOf(kind.descriptor);
+    } else {
+      // If this synthetic class was present on input from an intermediate compilation then it
+      // won't have the $$InternalSynthetic marker.
+      if (appView.options().desugarSpecificOptions().minimizeSyntheticNames
+          && appView.getSyntheticItems().isSyntheticInput(type)) {
+        index = binaryName.lastIndexOf(INNER_CLASS_SEPARATOR);
+      } else {
+        index = binaryName.lastIndexOf(SYNTHETIC_CLASS_SEPARATOR);
+      }
+    }
     if (index < 0) {
       throw new Unreachable("Unexpected failure to compute a synthetic prefix for " + binaryName);
     }
     return binaryName.substring(0, index);
   }
 
-  static String getOuterContextFromExternalSyntheticType(SyntheticKind kind, DexType type) {
+  static String getOuterContextFromExternalSyntheticType(
+      SyntheticKind kind, DexType type, InternalOptions options) {
     assert !kind.isGlobal();
     String binaryName = type.toBinaryName();
-    int index =
-        binaryName.lastIndexOf(
-            kind.isFixedSuffixSynthetic()
-                ? kind.descriptor
-                : EXTERNAL_SYNTHETIC_CLASS_SEPARATOR + kind.getDescriptor());
+    int index;
+    if (kind.isFixedSuffixSynthetic()) {
+      index = binaryName.lastIndexOf(kind.descriptor);
+    } else if (options.desugarSpecificOptions().minimizeSyntheticNames) {
+      index = binaryName.lastIndexOf(INNER_CLASS_SEPARATOR);
+    } else {
+      index = binaryName.lastIndexOf(EXTERNAL_SYNTHETIC_CLASS_SEPARATOR + kind.getDescriptor());
+    }
     if (index < 0) {
       throw new Unreachable(
           "Unexpected failure to determine the context of synthetic class: " + binaryName);
@@ -492,7 +507,7 @@
     if (kind.isFixedSuffixSynthetic()) {
       assert id.isEmpty();
       return createType("", kind, externalSyntheticTypePrefix, id, factory);
-    } else if (options.desugarSpecificOptions().minimizeSyntheticNames && !options.intermediate) {
+    } else if (options.desugarSpecificOptions().minimizeSyntheticNames) {
       return factory.createType(
           DescriptorUtils.getDescriptorFromClassBinaryName(
               externalSyntheticTypePrefix + INNER_CLASS_SEPARATOR + id));
diff --git a/src/test/java/com/android/tools/r8/compilerapi/syntheticscontexts/SyntheticContextsConsumerTest.java b/src/test/java/com/android/tools/r8/compilerapi/syntheticscontexts/SyntheticContextsConsumerTest.java
index 6c6544e..905b235 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/syntheticscontexts/SyntheticContextsConsumerTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/syntheticscontexts/SyntheticContextsConsumerTest.java
@@ -44,6 +44,9 @@
     D8TestCompileResult compileResult =
         testForD8(Backend.CF)
             .addProgramClasses(UsesBackport.class)
+            // Disable since the external compilation runs with non-minimal synthetic names.
+            .addOptionsModification(
+                options -> options.desugarSpecificOptions().minimizeSyntheticNames = false)
             .collectSyntheticItems()
             .setIntermediate(true)
             .setMinApi(1)
diff --git a/src/test/java/com/android/tools/r8/desugar/lambdas/DeduplicateLambdasWithDefaultMethodsTest.java b/src/test/java/com/android/tools/r8/desugar/lambdas/DeduplicateLambdasWithDefaultMethodsTest.java
index 62e4eb4..b08625b 100644
--- a/src/test/java/com/android/tools/r8/desugar/lambdas/DeduplicateLambdasWithDefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/lambdas/DeduplicateLambdasWithDefaultMethodsTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar.lambdas;
 
-import static com.android.tools.r8.synthesis.SyntheticItemsTestUtils.getDefaultSyntheticItemsTestUtils;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestBase;
@@ -33,22 +32,24 @@
 
   @Test
   public void test() throws Exception {
-    assertEquals(
-        ImmutableSet.of(
-            Reference.classFromClass(I.class),
-            Reference.classFromClass(TestClass.class),
-            SyntheticItemsTestUtils.syntheticCompanionClass(I.class),
-            getDefaultSyntheticItemsTestUtils().syntheticLambdaClass(TestClass.class, 0)),
-        testForD8(Backend.CF)
-            .addInnerClasses(getClass())
-            .setIntermediate(true)
-            .setMinApi(AndroidApiLevel.B)
-            .compile()
-            .inspector()
-            .allClasses()
-            .stream()
-            .map(FoundClassSubject::getFinalReference)
-            .collect(Collectors.toSet()));
+    testForD8(Backend.CF)
+        .addInnerClasses(getClass())
+        .collectSyntheticItems()
+        .setIntermediate(true)
+        .setMinApi(AndroidApiLevel.B)
+        .compile()
+        .inspectWithSyntheticItems(
+            (inspector, syntheticItems) -> {
+              assertEquals(
+                  ImmutableSet.of(
+                      Reference.classFromClass(I.class),
+                      Reference.classFromClass(TestClass.class),
+                      SyntheticItemsTestUtils.syntheticCompanionClass(I.class),
+                      syntheticItems.syntheticLambdaClass(TestClass.class, 0)),
+                  inspector.allClasses().stream()
+                      .map(FoundClassSubject::getFinalReference)
+                      .collect(Collectors.toSet()));
+            });
   }
 
   interface I {
diff --git a/src/test/java/com/android/tools/r8/globalsynthetics/GlobalSyntheticsEnsureClassesOutputTest.java b/src/test/java/com/android/tools/r8/globalsynthetics/GlobalSyntheticsEnsureClassesOutputTest.java
index 71d1d19..803751c 100644
--- a/src/test/java/com/android/tools/r8/globalsynthetics/GlobalSyntheticsEnsureClassesOutputTest.java
+++ b/src/test/java/com/android/tools/r8/globalsynthetics/GlobalSyntheticsEnsureClassesOutputTest.java
@@ -55,6 +55,9 @@
         .apply(
             b ->
                 b.getBuilder().addGlobalSyntheticsResourceProviders(globalsConsumer.getProviders()))
+        // Enable when enabled in GlobalSyntheticsGenerator above.
+        .addOptionsModification(
+            options -> options.desugarSpecificOptions().minimizeSyntheticNames = false)
         .setMinApi(AndroidApiLevel.K)
         .compile()
         .inspect(
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
index 7679c5a..1475ce4 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/ApiOutlineProfileRewritingShardTest.java
@@ -142,7 +142,7 @@
       Class<?> mainClass)
       throws Exception {
     // Verify that outlining happened.
-    verifyThat(inspector, parameters, LibraryClass.class)
+    verifyThat(inspector, parameters, LibraryClass.class, syntheticItems)
         .applyIf(
             isLibraryClassAlwaysPresent(),
             verifier ->
diff --git a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsAndStrippedMarkerTest.java b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsAndStrippedMarkerTest.java
index 9959eb7..12476f3 100644
--- a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsAndStrippedMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsAndStrippedMarkerTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.synthesis;
 
-import static com.android.tools.r8.synthesis.SyntheticItemsTestUtils.getDefaultSyntheticItemsTestUtils;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -53,15 +52,8 @@
 
   @Test
   public void test() throws Exception {
-    assertEquals(Backend.DEX, parameters.getBackend());
-
-    ClassReference syntheticLambdaClass =
-        getDefaultSyntheticItemsTestUtils().syntheticLambdaClass(UsesBackport.class, 0);
-    ImmutableSet<String> expectedClassOutputs =
-        ImmutableSet.of(descriptor(UsesBackport.class), syntheticLambdaClass.getDescriptor());
-
     Map<String, byte[]> firstCompilation = new HashMap<>();
-    D8TestCompileResult initialIntermediateCompileResult =
+    SyntheticItemsTestUtils firstSyntheticItems =
         testForD8(Backend.CF)
             // High API level such that only the lambda is desugared.
             .setMinApi(AndroidApiLevel.S)
@@ -84,10 +76,17 @@
                   @Override
                   public void finished(DiagnosticsHandler handler) {}
                 })
-            .compile();
+            .compile()
+            .getSyntheticItems();
+
+    ClassReference syntheticLambdaClass =
+        firstSyntheticItems.syntheticLambdaClass(UsesBackport.class, 0);
+    ImmutableSet<String> expectedClassOutputs =
+        ImmutableSet.of(descriptor(UsesBackport.class), syntheticLambdaClass.getDescriptor());
     assertEquals(expectedClassOutputs, firstCompilation.keySet());
 
     Map<String, byte[]> secondCompilation = new HashMap<>();
+    SyntheticItemsTestUtils secondSyntheticItems = null;
     ImmutableSet.Builder<String> allDescriptors = ImmutableSet.builder();
     BooleanBox matched = new BooleanBox(false);
     for (Entry<String, byte[]> entry : firstCompilation.entrySet()) {
@@ -99,8 +98,9 @@
               return entry.getKey();
             }
           };
-      D8TestCompileResult secondIntermediateCompileResult =
+      D8TestCompileResult secondCompileResult =
           testForD8(intermediateBackend)
+              .collectSyntheticItems()
               .setMinApi(parameters)
               .setIntermediate(true)
               .addClasspathClasses(I.class)
@@ -157,6 +157,9 @@
                             public void finished(DiagnosticsHandler handler) {}
                           }))
               .compile();
+      if (entry.getKey().equals(syntheticLambdaClass.getDescriptor())) {
+        secondSyntheticItems = secondCompileResult.getSyntheticItems();
+      }
     }
     assertTrue(matched.get());
     // The dex file per class file output should maintain the exact same set of primary descriptors.
@@ -165,13 +168,13 @@
     }
     // The total set of classes should also include the backport. The backport should be
     // hygienically placed under the synthetic lambda (not the context of the lambda!).
+    ClassReference syntheticBackportClass =
+        secondSyntheticItems.syntheticBackportClass(syntheticLambdaClass, 0);
+    assertEquals(syntheticLambdaClass.getTypeName() + "$0", syntheticBackportClass.getTypeName());
     assertEquals(
         ImmutableSet.<String>builder()
             .addAll(expectedClassOutputs)
-            .add(
-                getDefaultSyntheticItemsTestUtils()
-                    .syntheticBackportClass(syntheticLambdaClass, 0)
-                    .getDescriptor())
+            .add(syntheticBackportClass.getDescriptor())
             .build(),
         allDescriptors.build());
 
@@ -210,9 +213,7 @@
                       .collect(Collectors.toSet());
               // The initial lambda stays as the only item under UsesBackport.
               ClassReference lambdaClass =
-                  initialIntermediateCompileResult
-                      .getSyntheticItems()
-                      .syntheticLambdaClass(UsesBackport.class, 0);
+                  firstSyntheticItems.syntheticLambdaClass(UsesBackport.class, 0);
               // The nested backport has context in the lambda since the lambda was not marked.
               ClassReference backportClass =
                   thirdNonIntermediateCompileResult
diff --git a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsTest.java b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsTest.java
index bdbfaae..135082a 100644
--- a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsTest.java
+++ b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationNestedSyntheticsTest.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.synthesis;
 
-import static com.android.tools.r8.synthesis.SyntheticItemsTestUtils.getDefaultSyntheticItemsTestUtils;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -11,6 +10,7 @@
 
 import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.DesugarGraphConsumer;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
 import com.android.tools.r8.DiagnosticsHandler;
@@ -52,34 +52,37 @@
 
   @Test
   public void test() throws Exception {
-    assertEquals(Backend.DEX, parameters.getBackend());
+    Map<String, byte[]> firstCompilation = new HashMap<>();
+    SyntheticItemsTestUtils firstSyntheticItems =
+        testForD8(Backend.CF)
+            .collectSyntheticItems()
+            // High API level such that only the lambda is desugared.
+            .setMinApi(AndroidApiLevel.S)
+            .setIntermediate(true)
+            .addClasspathClasses(I.class)
+            .addProgramClasses(UsesBackport.class)
+            .setProgramConsumer(
+                new ClassFileConsumer() {
+                  @Override
+                  public void accept(
+                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                    firstCompilation.put(descriptor, data.copyByteData());
+                  }
+
+                  @Override
+                  public void finished(DiagnosticsHandler handler) {}
+                })
+            .compile()
+            .getSyntheticItems();
 
     ClassReference syntheticLambdaClass =
-        getDefaultSyntheticItemsTestUtils().syntheticLambdaClass(UsesBackport.class, 0);
+        firstSyntheticItems.syntheticLambdaClass(UsesBackport.class, 0);
     ImmutableSet<String> expectedClassOutputs =
         ImmutableSet.of(descriptor(UsesBackport.class), syntheticLambdaClass.getDescriptor());
-
-    Map<String, byte[]> firstCompilation = new HashMap<>();
-    testForD8(Backend.CF)
-        // High API level such that only the lambda is desugared.
-        .setMinApi(AndroidApiLevel.S)
-        .setIntermediate(true)
-        .addClasspathClasses(I.class)
-        .addProgramClasses(UsesBackport.class)
-        .setProgramConsumer(
-            new ClassFileConsumer() {
-              @Override
-              public void accept(ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                firstCompilation.put(descriptor, data.copyByteData());
-              }
-
-              @Override
-              public void finished(DiagnosticsHandler handler) {}
-            })
-        .compile();
     assertEquals(expectedClassOutputs, firstCompilation.keySet());
 
     Map<String, byte[]> secondCompilation = new HashMap<>();
+    SyntheticItemsTestUtils secondSyntheticItems = null;
     ImmutableSet.Builder<String> allDescriptors = ImmutableSet.builder();
     BooleanBox matched = new BooleanBox(false);
     for (Entry<String, byte[]> entry : firstCompilation.entrySet()) {
@@ -91,63 +94,68 @@
               return entry.getKey();
             }
           };
-      testForD8(intermediateBackend)
-          .setMinApi(parameters)
-          .setIntermediate(true)
-          .addClasspathClasses(I.class)
-          .apply(b -> b.getBuilder().addClassProgramData(bytes, origin))
-          .apply(
-              b ->
-                  b.getBuilder()
-                      .setDesugarGraphConsumer(
-                          new DesugarGraphConsumer() {
+      D8TestCompileResult secondCompileResult =
+          testForD8(intermediateBackend)
+              .collectSyntheticItems()
+              .setMinApi(parameters)
+              .setIntermediate(true)
+              .addClasspathClasses(I.class)
+              .apply(b -> b.getBuilder().addClassProgramData(bytes, origin))
+              .apply(
+                  b ->
+                      b.getBuilder()
+                          .setDesugarGraphConsumer(
+                              new DesugarGraphConsumer() {
 
+                                @Override
+                                public void accept(Origin dependent, Origin dependency) {
+                                  assertThat(
+                                      dependency.toString(), containsString(binaryName(I.class)));
+                                  assertThat(
+                                      dependent.toString(),
+                                      containsString(syntheticLambdaClass.getBinaryName()));
+                                  matched.set(true);
+                                }
+
+                                @Override
+                                public void finished() {}
+                              }))
+              .applyIf(
+                  intermediateBackend == Backend.CF,
+                  b ->
+                      b.setProgramConsumer(
+                          new ClassFileConsumer() {
                             @Override
-                            public void accept(Origin dependent, Origin dependency) {
-                              assertThat(
-                                  dependency.toString(), containsString(binaryName(I.class)));
-                              assertThat(
-                                  dependent.toString(),
-                                  containsString(syntheticLambdaClass.getBinaryName()));
-                              matched.set(true);
+                            public void accept(
+                                ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                              secondCompilation.put(descriptor, data.copyByteData());
+                              allDescriptors.add(descriptor);
                             }
 
                             @Override
-                            public void finished() {}
+                            public void finished(DiagnosticsHandler handler) {}
+                          }),
+                  b ->
+                      b.setProgramConsumer(
+                          new DexFilePerClassFileConsumer() {
+
+                            @Override
+                            public void accept(
+                                String primaryClassDescriptor,
+                                ByteDataView data,
+                                Set<String> descriptors,
+                                DiagnosticsHandler handler) {
+                              secondCompilation.put(primaryClassDescriptor, data.copyByteData());
+                              allDescriptors.addAll(descriptors);
+                            }
+
+                            @Override
+                            public void finished(DiagnosticsHandler handler) {}
                           }))
-          .applyIf(
-              intermediateBackend == Backend.CF,
-              b ->
-                  b.setProgramConsumer(
-                      new ClassFileConsumer() {
-                        @Override
-                        public void accept(
-                            ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                          secondCompilation.put(descriptor, data.copyByteData());
-                          allDescriptors.add(descriptor);
-                        }
-
-                        @Override
-                        public void finished(DiagnosticsHandler handler) {}
-                      }),
-              b ->
-                  b.setProgramConsumer(
-                      new DexFilePerClassFileConsumer() {
-
-                        @Override
-                        public void accept(
-                            String primaryClassDescriptor,
-                            ByteDataView data,
-                            Set<String> descriptors,
-                            DiagnosticsHandler handler) {
-                          secondCompilation.put(primaryClassDescriptor, data.copyByteData());
-                          allDescriptors.addAll(descriptors);
-                        }
-
-                        @Override
-                        public void finished(DiagnosticsHandler handler) {}
-                      }))
-          .compile();
+              .compile();
+      if (entry.getKey().equals(syntheticLambdaClass.getDescriptor())) {
+        secondSyntheticItems = secondCompileResult.getSyntheticItems();
+      }
     }
     assertTrue(matched.get());
     // The dex file per class file output should maintain the exact same set of primary descriptors.
@@ -156,13 +164,13 @@
     }
     // The total set of classes should also include the backport. The backport should be
     // hygienically placed under the synthetic lambda (not the context of the lambda!).
+    ClassReference syntheticBackportClass =
+        secondSyntheticItems.syntheticBackportClass(UsesBackport.class, 0);
+    assertEquals(syntheticLambdaClass.getTypeName() + "$0", syntheticBackportClass.getTypeName());
     assertEquals(
         ImmutableSet.<String>builder()
             .addAll(expectedClassOutputs)
-            .add(
-                getDefaultSyntheticItemsTestUtils()
-                    .syntheticBackportClass(syntheticLambdaClass, 0)
-                    .getDescriptor())
+            .add(syntheticBackportClass.getDescriptor())
             .build(),
         allDescriptors.build());
 
diff --git a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationSyntheticsTest.java b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationSyntheticsTest.java
index 212c062..cd76ece 100644
--- a/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationSyntheticsTest.java
+++ b/src/test/java/com/android/tools/r8/synthesis/RepeatedCompilationSyntheticsTest.java
@@ -3,17 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.synthesis;
 
-import static com.android.tools.r8.synthesis.SyntheticItemsTestUtils.getDefaultSyntheticItemsTestUtils;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
 import com.android.tools.r8.ByteDataView;
 import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.D8TestCompileResult;
 import com.android.tools.r8.DexFilePerClassFileConsumer;
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -61,87 +62,87 @@
 
   @Test
   public void test() throws Exception {
-    assertEquals(Backend.DEX, parameters.getBackend());
-
     Map<String, byte[]> firstCompilation = new HashMap<>();
-    testForD8(Backend.CF)
-        // High API level such that only the compareUnsigned is desugared.
-        .setMinApi(API_WITH_BYTE_COMPARE)
-        .setIntermediate(true)
-        .addProgramClassFileData(getTransformedUsesBackport())
-        .setProgramConsumer(
-            new ClassFileConsumer() {
-              @Override
-              public synchronized void accept(
-                  ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                byte[] old = firstCompilation.put(descriptor, data.copyByteData());
-                assertNull("Duplicate " + descriptor, old);
-              }
+    SyntheticItemsTestUtils firstSyntheticItems =
+        testForD8(Backend.CF)
+            .collectSyntheticItems()
+            // High API level such that only the compareUnsigned is desugared.
+            .setMinApi(API_WITH_BYTE_COMPARE)
+            .setIntermediate(true)
+            .addProgramClassFileData(getTransformedUsesBackport())
+            .setProgramConsumer(
+                new ClassFileConsumer() {
+                  @Override
+                  public synchronized void accept(
+                      ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                    byte[] old = firstCompilation.put(descriptor, data.copyByteData());
+                    assertNull("Duplicate " + descriptor, old);
+                  }
 
-              @Override
-              public void finished(DiagnosticsHandler handler) {}
-            })
-        .compile();
+                  @Override
+                  public void finished(DiagnosticsHandler handler) {}
+                })
+            .compile()
+            .getSyntheticItems();
     assertEquals(
         ImmutableSet.of(
             descriptor(UsesBackport.class),
-            getDefaultSyntheticItemsTestUtils()
-                .syntheticBackportClass(UsesBackport.class, 0)
-                .getDescriptor()),
+            firstSyntheticItems.syntheticBackportClass(UsesBackport.class, 0).getDescriptor()),
         firstCompilation.keySet());
 
     List<String> secondCompilation = new ArrayList<>();
+    SyntheticItemsTestUtils secondSyntheticItems = null;
     for (Entry<String, byte[]> entry : firstCompilation.entrySet()) {
       byte[] bytes = entry.getValue();
-      testForD8(intermediateBackend)
-          .setMinApi(parameters)
-          .setIntermediate(true)
-          .addProgramClassFileData(bytes)
-          .applyIf(
-              intermediateBackend == Backend.CF,
-              b ->
-                  b.setProgramConsumer(
-                      new ClassFileConsumer() {
-                        @Override
-                        public synchronized void accept(
-                            ByteDataView data, String descriptor, DiagnosticsHandler handler) {
-                          secondCompilation.add(descriptor);
-                        }
+      D8TestCompileResult secondCompileResult =
+          testForD8(intermediateBackend)
+              .collectSyntheticItems()
+              .setMinApi(parameters)
+              .setIntermediate(true)
+              .addProgramClassFileData(bytes)
+              .applyIf(
+                  intermediateBackend == Backend.CF,
+                  b ->
+                      b.setProgramConsumer(
+                          new ClassFileConsumer() {
+                            @Override
+                            public synchronized void accept(
+                                ByteDataView data, String descriptor, DiagnosticsHandler handler) {
+                              secondCompilation.add(descriptor);
+                            }
 
-                        @Override
-                        public void finished(DiagnosticsHandler handler) {}
-                      }),
-              b ->
-                  b.setProgramConsumer(
-                      new DexFilePerClassFileConsumer() {
-                        @Override
-                        public void accept(
-                            String primaryClassDescriptor,
-                            ByteDataView data,
-                            Set<String> descriptors,
-                            DiagnosticsHandler handler) {
-                          secondCompilation.addAll(descriptors);
-                        }
+                            @Override
+                            public void finished(DiagnosticsHandler handler) {}
+                          }),
+                  b ->
+                      b.setProgramConsumer(
+                          new DexFilePerClassFileConsumer() {
+                            @Override
+                            public void accept(
+                                String primaryClassDescriptor,
+                                ByteDataView data,
+                                Set<String> descriptors,
+                                DiagnosticsHandler handler) {
+                              secondCompilation.addAll(descriptors);
+                            }
 
-                        @Override
-                        public void finished(DiagnosticsHandler handler) {}
-                      }))
-          .compile();
+                            @Override
+                            public void finished(DiagnosticsHandler handler) {}
+                          }))
+              .compile();
+      if (entry.getKey().equals(descriptor(UsesBackport.class))) {
+        secondSyntheticItems = secondCompileResult.getSyntheticItems();
+      }
     }
 
     // TODO(b/271235788): The repeated compilation is unsound and we have duplicate definitions of
     //  the backports both using the same type name.
-    secondCompilation.sort(String::compareTo);
     assertEquals(
         ImmutableList.of(
-            getDefaultSyntheticItemsTestUtils()
-                .syntheticBackportClass(UsesBackport.class, 0)
-                .getDescriptor(),
-            getDefaultSyntheticItemsTestUtils()
-                .syntheticBackportClass(UsesBackport.class, 0)
-                .getDescriptor(),
+            firstSyntheticItems.syntheticBackportClass(UsesBackport.class, 0).getDescriptor(),
+            secondSyntheticItems.syntheticBackportClass(UsesBackport.class, 0).getDescriptor(),
             descriptor(UsesBackport.class)),
-        secondCompilation);
+        ListUtils.destructiveSort(secondCompilation, String::compareTo));
   }
 
   private byte[] getTransformedUsesBackport() throws Exception {
diff --git a/src/test/testbase/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java b/src/test/testbase/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
index cd022f8..26f99a1 100644
--- a/src/test/testbase/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
+++ b/src/test/testbase/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.apimodel;
 
-import static com.android.tools.r8.synthesis.SyntheticItemsTestUtils.getDefaultSyntheticItemsTestUtils;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.accessesField;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethod;
 import static com.android.tools.r8.utils.codeinspector.CodeMatchers.invokesMethodWithHolderAndName;
@@ -242,7 +241,7 @@
 
   public static ApiModelingClassVerificationHelper verifyThat(
       CodeInspector inspector, TestParameters parameters, Class<?> clazz) {
-    return verifyThat(inspector, parameters, clazz, getDefaultSyntheticItemsTestUtils());
+    return verifyThat(inspector, parameters, clazz, null);
   }
 
   public static ApiModelingClassVerificationHelper verifyThat(
diff --git a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1 b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
index 8e95b3e..f5f3ac0 100644
--- a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
+++ b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
@@ -1 +1 @@
-ba206a3d39e1bac4793e54c9c30f3072ba220f3e
\ No newline at end of file
+e923542ae70a4c3944f53f434501677680db914e
\ No newline at end of file