Make eventConsumer types explicit

Bug: 191656218
Change-Id: Ife7d03292d765c36c371fc3aec308029886ee001
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
index 94d1ce7..8a59f14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeter.java
@@ -28,6 +28,7 @@
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterInstructionEventConsumer;
 import com.android.tools.r8.utils.collections.DexClassAndMethodSet;
 import java.util.Collection;
 import java.util.Collections;
@@ -124,7 +125,7 @@
         new InvokeRetargetingResult(false, ignored -> null);
 
     private final boolean hasNewInvokeTarget;
-    private final Function<DesugaredLibraryRetargeterSynthesizerEventConsumer, DexMethod>
+    private final Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
         newInvokeTargetSupplier;
 
     static InvokeRetargetingResult createInvokeRetargetingResult(DexMethod retarget) {
@@ -136,7 +137,7 @@
 
     private InvokeRetargetingResult(
         boolean hasNewInvokeTarget,
-        Function<DesugaredLibraryRetargeterSynthesizerEventConsumer, DexMethod>
+        Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
             newInvokeTargetSupplier) {
       this.hasNewInvokeTarget = hasNewInvokeTarget;
       this.newInvokeTargetSupplier = newInvokeTargetSupplier;
@@ -147,7 +148,7 @@
     }
 
     public DexMethod getNewInvokeTarget(
-        DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+        DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
       assert hasNewInvokeTarget();
       return newInvokeTargetSupplier.apply(eventConsumer);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
index 4d43106..13a0a6d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterL8Synthesizer.java
@@ -45,7 +45,7 @@
       futures.add(
           executorService.submit(
               () -> {
-                syntheticHelper.ensureEmulatedHolderDispatchMethod(
+                syntheticHelper.ensureProgramEmulatedHolderDispatchMethod(
                     emulatedDispatchMethod, eventConsumer);
                 return null;
               }));
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
index 81b65dc..fab6f10 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
@@ -11,41 +11,16 @@
 
 public interface DesugaredLibraryRetargeterSynthesizerEventConsumer {
 
-  default DesugaredLibraryRetargeterL8SynthesizerEventConsumer asProgramSynthesizer() {
-    assert false;
-    return null;
-  }
-
-  default DesugaredLibraryRetargeterInstructionEventConsumer asClasspathSynthesizer() {
-    assert false;
-    return null;
-  }
-
-  interface DesugaredLibraryRetargeterL8SynthesizerEventConsumer
-      extends DesugaredLibraryRetargeterSynthesizerEventConsumer {
-
-    @Override
-    default DesugaredLibraryRetargeterL8SynthesizerEventConsumer asProgramSynthesizer() {
-      return this;
-    }
-
+  interface DesugaredLibraryRetargeterL8SynthesizerEventConsumer {
     void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz);
   }
 
-  interface DesugaredLibraryRetargeterInstructionEventConsumer
-      extends DesugaredLibraryRetargeterSynthesizerEventConsumer {
-
-    @Override
-    default DesugaredLibraryRetargeterInstructionEventConsumer asClasspathSynthesizer() {
-      return this;
-    }
-
+  interface DesugaredLibraryRetargeterInstructionEventConsumer {
     void acceptDesugaredLibraryRetargeterDispatchClasspathClass(DexClasspathClass clazz);
   }
 
   interface DesugaredLibraryRetargeterPostProcessingEventConsumer
       extends DesugaredLibraryRetargeterInstructionEventConsumer {
-
     void acceptInterfaceInjection(DexProgramClass clazz, DexClass newInterface);
 
     void acceptForwardingMethod(ProgramMethod method);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
index 35ddc35..9569c61 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -29,94 +29,100 @@
 
   public DexClass ensureEmulatedHolderDispatchMethod(
       DexClassAndMethod emulatedDispatchMethod,
-      DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+      DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
     assert eventConsumer != null;
+    if (appView.options().isDesugaredLibraryCompilation()) {
+      return appView
+          .getSyntheticItems()
+          .getExistingFixedClass(
+              SyntheticKind.RETARGET_CLASS, emulatedDispatchMethod.getHolder(), appView);
+    }
     DexClass interfaceClass =
         ensureEmulatedInterfaceDispatchMethod(emulatedDispatchMethod, eventConsumer);
     DexMethod itfMethod =
         interfaceClass.lookupMethod(emulatedDispatchMethod.getReference()).getReference();
-    DexClass holderDispatch;
-    if (appView.options().isDesugaredLibraryCompilation()) {
-      holderDispatch =
-          appView
-              .getSyntheticItems()
-              .ensureFixedClass(
-                  SyntheticKind.RETARGET_CLASS,
-                  emulatedDispatchMethod.getHolder(),
-                  appView,
-                  classBuilder ->
-                      buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
-                  clazz -> {
-                    DesugaredLibraryRetargeterL8SynthesizerEventConsumer programEventConsumer =
-                        eventConsumer.asProgramSynthesizer();
-                    assert programEventConsumer != null;
-                    programEventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(
-                        clazz);
-                  });
-    } else {
-      ClasspathOrLibraryClass context =
-          emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
-      DesugaredLibraryRetargeterInstructionEventConsumer classpathEventConsumer =
-          eventConsumer.asClasspathSynthesizer();
-      assert classpathEventConsumer != null;
-      assert context != null;
-      holderDispatch =
-          appView
-              .getSyntheticItems()
-              .ensureFixedClasspathClass(
-                  SyntheticKind.RETARGET_CLASS,
-                  context,
-                  appView,
-                  classBuilder ->
-                      buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
-                  classpathEventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass);
-    }
-    rewriteType(holderDispatch.type);
-    return holderDispatch;
+    ClasspathOrLibraryClass context =
+        emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
+    assert context != null;
+    return appView
+        .getSyntheticItems()
+        .ensureFixedClasspathClass(
+            SyntheticKind.RETARGET_CLASS,
+            context,
+            appView,
+            classBuilder ->
+                buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
+            clazz -> {
+              eventConsumer.acceptDesugaredLibraryRetargeterDispatchClasspathClass(clazz);
+              rewriteType(clazz.type);
+            });
+  }
+
+  public void ensureProgramEmulatedHolderDispatchMethod(
+      DexClassAndMethod emulatedDispatchMethod,
+      DesugaredLibraryRetargeterL8SynthesizerEventConsumer eventConsumer) {
+    assert eventConsumer != null;
+    assert appView.options().isDesugaredLibraryCompilation();
+    DexClass interfaceClass =
+        ensureEmulatedInterfaceDispatchMethod(emulatedDispatchMethod, eventConsumer);
+    DexMethod itfMethod =
+        interfaceClass.lookupMethod(emulatedDispatchMethod.getReference()).getReference();
+    appView
+        .getSyntheticItems()
+        .ensureFixedClass(
+            SyntheticKind.RETARGET_CLASS,
+            emulatedDispatchMethod.getHolder(),
+            appView,
+            classBuilder ->
+                buildHolderDispatchMethod(classBuilder, emulatedDispatchMethod, itfMethod),
+            clazz -> {
+              eventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(clazz);
+              rewriteType(clazz.type);
+            });
   }
 
   public DexClass ensureEmulatedInterfaceDispatchMethod(
       DexClassAndMethod emulatedDispatchMethod,
-      DesugaredLibraryRetargeterSynthesizerEventConsumer eventConsumer) {
+      DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
     assert eventConsumer != null;
-    DexClass interfaceDispatch;
     if (appView.options().isDesugaredLibraryCompilation()) {
-      interfaceDispatch =
-          appView
-              .getSyntheticItems()
-              .ensureFixedClass(
-                  SyntheticKind.RETARGET_INTERFACE,
-                  emulatedDispatchMethod.getHolder(),
-                  appView,
-                  classBuilder ->
-                      buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
-                  clazz -> {
-                    DesugaredLibraryRetargeterL8SynthesizerEventConsumer programEventConsumer =
-                        eventConsumer.asProgramSynthesizer();
-                    assert programEventConsumer != null;
-                    programEventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(
-                        clazz);
-                  });
-    } else {
-      DesugaredLibraryRetargeterInstructionEventConsumer classpathEventConsumer =
-          eventConsumer.asClasspathSynthesizer();
-      assert classpathEventConsumer != null;
-      ClasspathOrLibraryClass context =
-          emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
-      assert context != null;
-      interfaceDispatch =
-          appView
-              .getSyntheticItems()
-              .ensureFixedClasspathClass(
-                  SyntheticKind.RETARGET_INTERFACE,
-                  context,
-                  appView,
-                  classBuilder ->
-                      buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
-                  classpathEventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass);
+      return appView
+          .getSyntheticItems()
+          .getExistingFixedClass(
+              SyntheticKind.RETARGET_INTERFACE, emulatedDispatchMethod.getHolder(), appView);
     }
-    rewriteType(interfaceDispatch.type);
-    return interfaceDispatch;
+    ClasspathOrLibraryClass context =
+        emulatedDispatchMethod.getHolder().asClasspathOrLibraryClass();
+    assert context != null;
+    return appView
+        .getSyntheticItems()
+        .ensureFixedClasspathClass(
+            SyntheticKind.RETARGET_INTERFACE,
+            context,
+            appView,
+            classBuilder -> buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
+            clazz -> {
+              eventConsumer.acceptDesugaredLibraryRetargeterDispatchClasspathClass(clazz);
+              rewriteType(clazz.type);
+            });
+  }
+
+  public DexClass ensureEmulatedInterfaceDispatchMethod(
+      DexClassAndMethod emulatedDispatchMethod,
+      DesugaredLibraryRetargeterL8SynthesizerEventConsumer eventConsumer) {
+    assert appView.options().isDesugaredLibraryCompilation();
+    assert eventConsumer != null;
+    return appView
+        .getSyntheticItems()
+        .ensureFixedClass(
+            SyntheticKind.RETARGET_INTERFACE,
+            emulatedDispatchMethod.getHolder(),
+            appView,
+            classBuilder -> buildInterfaceDispatchMethod(classBuilder, emulatedDispatchMethod),
+            clazz -> {
+              eventConsumer.acceptDesugaredLibraryRetargeterDispatchProgramClass(clazz);
+              rewriteType(clazz.type);
+            });
   }
 
   private void buildInterfaceDispatchMethod(
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 40b70e4..a86e143 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -508,16 +508,31 @@
       DexProgramClass context,
       AppView<?> appView,
       Consumer<SyntheticProgramClassBuilder> fn) {
-    // Obtain the outer synthesizing context in the case the context itself is synthetic.
-    // This is to ensure a flat input-type -> synthetic-item mapping.
-    SynthesizingContext outerContext =
-        context.isProgramClass()
-            ? getSynthesizingContext(context.asProgramClass(), appView)
-            : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+    SynthesizingContext outerContext = internalGetOuterContext(context, appView);
     DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
     return internalCreateClass(kind, fn, outerContext, type, appView.dexItemFactory());
   }
 
+  public DexProgramClass getExistingFixedClass(
+      SyntheticKind kind, DexClass context, AppView<?> appView) {
+    assert kind.isFixedSuffixSynthetic;
+    SynthesizingContext outerContext = internalGetOuterContext(context, appView);
+    DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
+    DexClass clazz = appView.definitionFor(type);
+    assert clazz != null;
+    assert isSyntheticClass(type);
+    assert clazz.isProgramClass();
+    return clazz.asProgramClass();
+  }
+
+  // Obtain the outer synthesizing context in the case the context itself is synthetic.
+  // This is to ensure a flat input-type -> synthetic-item mapping.
+  private SynthesizingContext internalGetOuterContext(DexClass context, AppView<?> appView) {
+    return context.isProgramClass()
+        ? getSynthesizingContext(context.asProgramClass(), appView)
+        : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+  }
+
   /**
    * Ensure that a fixed synthetic class exists.
    *
@@ -530,12 +545,7 @@
       Consumer<SyntheticProgramClassBuilder> fn,
       Consumer<DexProgramClass> onCreationConsumer) {
     assert kind.isFixedSuffixSynthetic;
-    // Obtain the outer synthesizing context in the case the context itself is synthetic.
-    // This is to ensure a flat input-type -> synthetic-item mapping.
-    SynthesizingContext outerContext =
-        context.isProgramClass()
-            ? getSynthesizingContext(context.asProgramClass(), appView)
-            : SynthesizingContext.fromNonSyntheticInputContext(context.asClasspathOrLibraryClass());
+    SynthesizingContext outerContext = internalGetOuterContext(context, appView);
     DexType type = SyntheticNaming.createFixedType(kind, outerContext, appView.dexItemFactory());
     // Fast path is that the synthetic is already present. If so it must be a program class.
     DexClass clazz = appView.definitionFor(type);