Rewrite InvokeSpecialToSelfDesugaring to use DesugaringDescription

Fixes: b/270144535
Change-Id: I6e4c045cad465592efe7855877be90d8cc5a2783
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
index 310856f..534ca0c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/invokespecial/InvokeSpecialToSelfDesugaring.java
@@ -6,7 +6,6 @@
 
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
 import com.android.tools.r8.graph.DexClassAndMethod;
@@ -15,14 +14,9 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaring;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
-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.DesugarDescription;
 import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder;
 import com.google.common.collect.ImmutableList;
-import java.util.Collection;
-import java.util.List;
 import org.objectweb.asm.Opcodes;
 
 /** This class defines the desugaring of a single invoke-special instruction. */
@@ -37,22 +31,19 @@
   }
 
   @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    if (instruction.isInvokeSpecial()) {
-      return needsDesugaring(instruction.asInvoke(), context) != null;
+  public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
+    if (!instruction.isInvokeSpecial()) {
+      return DesugarDescription.nothing();
     }
-    return false;
-  }
 
-  /** @return the resolved method if desugaring is needed, otherwise null. */
-  private ProgramMethod needsDesugaring(CfInvoke invoke, ProgramMethod context) {
+    CfInvoke invoke = instruction.asInvoke();
     if (!invoke.isInvokeSpecial() || invoke.isInvokeConstructor(dexItemFactory)) {
-      return null;
+      return DesugarDescription.nothing();
     }
 
     DexMethod invokedMethod = invoke.getMethod();
     if (invokedMethod.getHolderType() != context.getHolderType()) {
-      return null;
+      return DesugarDescription.nothing();
     }
 
     ProgramMethod method = context.getHolder().lookupProgramMethod(invokedMethod);
@@ -60,48 +51,41 @@
         || method.getAccessFlags().isPrivate()
         || method.getDefinition().isStatic()
         || (invoke.isInterface() && method.isDefaultMethod())) {
-      return null;
-    }
-
-    return method;
-  }
-
-  @Override
-  public Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
-    if (instruction.isInvokeSpecial()) {
-      return desugarInvokeInstruction(instruction.asInvoke(), eventConsumer, context);
-    }
-    return null;
-  }
-
-  private List<CfInstruction> desugarInvokeInstruction(
-      CfInvoke invoke,
-      InvokeSpecialToSelfDesugaringEventConsumer eventConsumer,
-      ProgramMethod context) {
-    ProgramMethod method = needsDesugaring(invoke, context);
-    if (method == null) {
-      return null;
+      return DesugarDescription.nothing();
     }
 
     if (method.getAccessFlags().isFinal()) {
       // This method is final thus we can use invoke-virtual.
-      return ImmutableList.of(
-          new CfInvoke(Opcodes.INVOKEVIRTUAL, invoke.getMethod(), invoke.isInterface()));
+      return DesugarDescription.builder()
+          .setDesugarRewrite(
+              (freshLocalProvider,
+                  localStackAllocator,
+                  eventConsumer,
+                  ignore, // context
+                  methodProcessingContext,
+                  dexItemFactory) ->
+                  ImmutableList.of(
+                      new CfInvoke(
+                          Opcodes.INVOKEVIRTUAL, invoke.getMethod(), invoke.isInterface())))
+          .build();
     }
 
     // This is an invoke-special to a virtual method on invoke-special method holder.
     // The invoke should be rewritten with a bridge.
-    DexMethod bridgeMethod = ensureInvokeSpecialBridge(method, eventConsumer);
-    return ImmutableList.of(
-        new CfInvoke(Opcodes.INVOKESPECIAL, bridgeMethod, invoke.isInterface()));
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                ignore, // context
+                methodProcessingContext,
+                dexItemFactory) ->
+                ImmutableList.of(
+                    new CfInvoke(
+                        Opcodes.INVOKESPECIAL,
+                        ensureInvokeSpecialBridge(method, eventConsumer),
+                        invoke.isInterface())))
+        .build();
   }
 
   private DexMethod ensureInvokeSpecialBridge(