Rewrite TwrInstructionDesugaring to use DesugarDescription

Fixes: b/270144892
Change-Id: I0d061d62559fedddd1a3b09971f5002c0698a6fd
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
index 7a9423b..6f2b1a6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/twr/TwrInstructionDesugaring.java
@@ -17,14 +17,10 @@
 import com.android.tools.r8.graph.MethodAccessFlags;
 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.desugar.backports.BackportedMethods;
 import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector;
 import com.google.common.collect.ImmutableList;
-import java.util.Collection;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import org.objectweb.asm.Opcodes;
@@ -48,74 +44,87 @@
   }
 
   @Override
-  public Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
+  public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (!instruction.isInvoke()) {
-      return null;
+      return DesugarDescription.nothing();
     }
     if (isTwrCloseResourceInvoke(instruction)) {
-      return rewriteTwrCloseResourceInvoke(eventConsumer, methodProcessingContext);
+      return rewriteTwrCloseResourceInvoke();
     }
     if (!appView.options().canUseSuppressedExceptions()) {
       if (isTwrSuppressedInvoke(instruction, addSuppressed)) {
-        return rewriteTwrAddSuppressedInvoke(eventConsumer, methodProcessingContext);
+        return rewriteTwrAddSuppressedInvoke();
       }
       if (isTwrSuppressedInvoke(instruction, getSuppressed)) {
-        return rewriteTwrGetSuppressedInvoke(eventConsumer, methodProcessingContext);
+        return rewriteTwrGetSuppressedInvoke();
       }
     }
-    return null;
+    return DesugarDescription.nothing();
   }
 
-  private Collection<CfInstruction> rewriteTwrAddSuppressedInvoke(
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      MethodProcessingContext methodProcessingContext) {
+  private DesugarDescription rewriteTwrAddSuppressedInvoke() {
     DexItemFactory factory = appView.dexItemFactory();
     DexProto proto =
         factory.createProto(factory.voidType, factory.throwableType, factory.throwableType);
-    return createAndCallSyntheticMethod(
-        kinds -> kinds.BACKPORT,
-        proto,
-        BackportedMethods::ThrowableMethods_addSuppressed,
-        methodProcessingContext,
-        eventConsumer::acceptBackportedMethod,
-        methodProcessingContext.getMethodContext());
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context,
+                methodProcessingContext,
+                dexItemFactory) ->
+                createAndCallSyntheticMethod(
+                    kinds -> kinds.BACKPORT,
+                    proto,
+                    BackportedMethods::ThrowableMethods_addSuppressed,
+                    methodProcessingContext,
+                    eventConsumer::acceptBackportedMethod,
+                    methodProcessingContext.getMethodContext()))
+        .build();
   }
 
-  private Collection<CfInstruction> rewriteTwrGetSuppressedInvoke(
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      MethodProcessingContext methodProcessingContext) {
+  private DesugarDescription rewriteTwrGetSuppressedInvoke() {
     DexItemFactory factory = appView.dexItemFactory();
     DexProto proto =
         factory.createProto(
             factory.createArrayType(1, factory.throwableType), factory.throwableType);
-    return createAndCallSyntheticMethod(
-        kinds -> kinds.BACKPORT,
-        proto,
-        BackportedMethods::ThrowableMethods_getSuppressed,
-        methodProcessingContext,
-        eventConsumer::acceptBackportedMethod,
-        methodProcessingContext.getMethodContext());
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context,
+                methodProcessingContext,
+                dexItemFactory) ->
+                createAndCallSyntheticMethod(
+                    kinds -> kinds.BACKPORT,
+                    proto,
+                    BackportedMethods::ThrowableMethods_getSuppressed,
+                    methodProcessingContext,
+                    eventConsumer::acceptBackportedMethod,
+                    methodProcessingContext.getMethodContext()))
+        .build();
   }
 
-  private ImmutableList<CfInstruction> rewriteTwrCloseResourceInvoke(
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      MethodProcessingContext methodProcessingContext) {
+  private DesugarDescription rewriteTwrCloseResourceInvoke() {
     // Synthesize a new method.
-    return createAndCallSyntheticMethod(
-        kinds -> kinds.TWR_CLOSE_RESOURCE,
-        twrCloseResourceProto,
-        BackportedMethods::CloseResourceMethod_closeResourceImpl,
-        methodProcessingContext,
-        eventConsumer::acceptTwrCloseResourceMethod,
-        methodProcessingContext.getMethodContext());
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context,
+                methodProcessingContext,
+                dexItemFactory) ->
+                createAndCallSyntheticMethod(
+                    kinds -> kinds.TWR_CLOSE_RESOURCE,
+                    twrCloseResourceProto,
+                    BackportedMethods::CloseResourceMethod_closeResourceImpl,
+                    methodProcessingContext,
+                    eventConsumer::acceptTwrCloseResourceMethod,
+                    methodProcessingContext.getMethodContext()))
+        .build();
   }
 
   private ImmutableList<CfInstruction> createAndCallSyntheticMethod(
@@ -144,16 +153,6 @@
     return ImmutableList.of(new CfInvoke(Opcodes.INVOKESTATIC, method.getReference(), false));
   }
 
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    if (!instruction.isInvoke()) {
-      return false;
-    }
-    return isTwrCloseResourceInvoke(instruction)
-        || isTwrSuppressedInvoke(instruction, addSuppressed)
-        || isTwrSuppressedInvoke(instruction, getSuppressed);
-  }
-
   private boolean isTwrSuppressedInvoke(CfInstruction instruction, DexMethod suppressed) {
     return instruction.isInvoke()
         && matchesMethodOfThrowable(instruction.asInvoke().getMethod(), suppressed);