Rewrite LambdaInstructionDesugaring to use DesugaringDescription

Fixes: b/270144537
Change-Id: I102b2906d13fdf667724121476f59e22593a5e32
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index bf17d33..a241940 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -110,6 +110,7 @@
                 eventConsumer,
                 ignore, // context
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 methodProvider.rewriteInvoke(
                     invoke, appView, eventConsumer, methodProcessingContext, localStackAllocator))
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
index bb900d3..7cff400b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BufferCovariantReturnTypeRewriter.java
@@ -51,6 +51,7 @@
                 eventConsumer,
                 ignore, // context
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 ImmutableList.of(newInvoke, new CfCheckCast(invokedMethod.getReturnType())))
         .build();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
index 0d454d6..f65d62c 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaring.java
@@ -53,6 +53,7 @@
             eventConsumer,
             context,
             methodProcessingContext,
+            desugaringCollection,
             dexItemFactory);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
index 79e6e04..ab7f14a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugarDescription.java
@@ -38,6 +38,7 @@
       CfInstructionDesugaringEventConsumer eventConsumer,
       ProgramMethod context,
       MethodProcessingContext methodProcessingContext,
+      CfInstructionDesugaringCollection desugaringCollection,
       DexItemFactory dexItemFactory) {
     return null;
   }
@@ -64,6 +65,7 @@
         CfInstructionDesugaringEventConsumer eventConsumer,
         ProgramMethod context,
         MethodProcessingContext methodProcessingContext,
+        CfInstructionDesugaringCollection desugaringCollection,
         DexItemFactory dexItemFactory);
   }
 
@@ -142,6 +144,7 @@
             CfInstructionDesugaringEventConsumer eventConsumer,
             ProgramMethod context,
             MethodProcessingContext methodProcessingContext,
+            CfInstructionDesugaringCollection desugaringCollection,
             DexItemFactory dexItemFactory) {
           return desugarRewrite == null
               ? null
@@ -151,6 +154,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory);
         }
       };
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
index 7bef7e4..09e3186 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InvokeToPrivateRewriter.java
@@ -42,6 +42,7 @@
                 eventConsumer,
                 ignore, // context
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 ImmutableList.of(new CfInvoke(Opcodes.INVOKESPECIAL, method, invoke.isInterface())))
         .build();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
index 1b07110..b62d335 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/UnrepresentableInDexInstructionRemover.java
@@ -166,6 +166,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 report(context);
                 Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -215,6 +216,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 report(context);
                 Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -260,6 +262,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 report(context);
                 Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -299,6 +302,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 report(context);
                 Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -339,6 +343,7 @@
                   eventConsumer,
                   context,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 report(context);
                 Builder<CfInstruction> replacement = ImmutableList.builder();
@@ -388,6 +393,7 @@
             eventConsumer,
             context,
             methodProcessingContext,
+            desugaringCollection,
             dexItemFactory);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
index 71ce242..e2a0c14 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -79,6 +79,7 @@
                 eventConsumer,
                 context1,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 desugarLibraryCall(
                     methodProcessingContext.createUniqueContext(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
index 70d6da1..0ee4ce0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/constantdynamic/ConstantDynamicInstructionDesugaring.java
@@ -99,6 +99,7 @@
                 eventConsumer,
                 context1,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 desugarConstDynamicInstruction(
                     instruction.asConstDynamic(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
index 4079aa2..ff3989a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/icce/AlwaysThrowingInstructionDesugaring.java
@@ -75,6 +75,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 getThrowInstructions(
                     appView,
@@ -97,6 +98,7 @@
                     eventConsumer,
                     context,
                     methodProcessingContext,
+                    desugaringCollection,
                     dexItemFactory) ->
                     getThrowInstructions(
                         appView,
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 534ca0c..301802b 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
@@ -63,6 +63,7 @@
                   eventConsumer,
                   ignore, // context
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) ->
                   ImmutableList.of(
                       new CfInvoke(
@@ -79,6 +80,7 @@
                 eventConsumer,
                 ignore, // context
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 ImmutableList.of(
                     new CfInvoke(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 79e8185..ce4afdd 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -424,6 +424,7 @@
                   eventConsumer,
                   context1,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 ProgramMethod newProgramMethod =
                     appView
@@ -472,6 +473,7 @@
                 eventConsumer,
                 context12,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) -> {
               DexClassAndMethod companionMethod =
                   helper.ensureStaticAsMethodOfCompanionClassStub(method, eventConsumer);
@@ -517,6 +519,7 @@
                 eventConsumer,
                 context1,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 getInvokeStaticInstructions(
                     helper
@@ -563,6 +566,7 @@
                   eventConsumer,
                   context1,
                   methodProcessingContext,
+                  desugaringCollection,
                   dexItemFactory) -> {
                 // This can be a private instance method call. Note that the referenced
                 // method is expected to be in the current class since it is private, but desugaring
@@ -602,6 +606,7 @@
                     eventConsumer,
                     context12,
                     methodProcessingContext,
+                    desugaringCollection,
                     dexItemFactory) -> {
                   // This is a invoke-direct call to a virtual method.
                   DexClassAndMethod companionMethod =
@@ -718,6 +723,7 @@
                     eventConsumer,
                     context1,
                     methodProcessingContext,
+                    desugaringCollection,
                     dexItemFactory) -> {
                   DexClassAndMethod method = resolutionResult.getResolutionPair();
                   DexMethod companionMethod;
@@ -740,6 +746,7 @@
                     eventConsumer,
                     context12,
                     methodProcessingContext,
+                    desugaringCollection,
                     dexItemFactory) -> {
                   DexClassAndMethod method = resolutionResult.getResolutionPair();
                   // TODO(b/199135051): Why do this amend routine. We have done resolution, so would
@@ -800,6 +807,7 @@
                       eventConsumer,
                       context13,
                       methodProcessingContext,
+                      desugaringCollection,
                       dexItemFactory) -> {
                     DexClassAndMethod companionTarget =
                         helper.ensureDefaultAsMethodOfCompanionClassStub(
@@ -826,6 +834,7 @@
                 eventConsumer,
                 context14,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 getInvokeStaticInstructions(
                     helper.ensureEmulatedInterfaceForwardingMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
index 532909b..8c625a7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/lambda/LambdaInstructionDesugaring.java
@@ -16,7 +16,6 @@
 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.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexMethodHandle;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -24,8 +23,8 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.ValueType;
 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.DesugarDescription;
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LambdaClass;
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
@@ -68,33 +67,36 @@
   }
 
   @Override
-  public Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
-    if (instruction.isInvokeDynamic()) {
-      return desugarInvokeDynamicInstruction(
-          instruction.asInvokeDynamic(),
-          freshLocalProvider,
-          localStackAllocator,
-          eventConsumer,
-          context,
-          methodProcessingContext,
-          (invoke, localProvider, stackAllocator) ->
-              desugaringCollection.desugarInstruction(
-                  invoke,
-                  localProvider,
-                  stackAllocator,
-                  eventConsumer,
-                  context,
-                  methodProcessingContext));
+  public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
+    if (!isLambdaInvoke(instruction, context, appView)) {
+      return DesugarDescription.nothing();
     }
-    return null;
+
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                ignore, // context
+                methodProcessingContext,
+                desugaringCollection,
+                dexItemFactory) ->
+                desugarInvokeDynamicInstruction(
+                    instruction.asInvokeDynamic(),
+                    freshLocalProvider,
+                    localStackAllocator,
+                    eventConsumer,
+                    context,
+                    methodProcessingContext,
+                    (invoke, localProvider, stackAllocator) ->
+                        desugaringCollection.desugarInstruction(
+                            invoke,
+                            localProvider,
+                            stackAllocator,
+                            eventConsumer,
+                            context,
+                            methodProcessingContext)))
+        .build();
   }
 
   public interface DesugarInvoke {
@@ -181,11 +183,6 @@
     return lambdaClass;
   }
 
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    return isLambdaInvoke(instruction, context, appView);
-  }
-
   public static boolean isLambdaInvoke(
       CfInstruction instruction, ProgramMethod context, AppView<?> appView) {
     return instruction.isInvokeDynamic()
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
index b95fd85..726ce09 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/stringconcat/StringConcatInstructionDesugaring.java
@@ -95,6 +95,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 desugarMakeConcatInstructions(invoke, freshLocalProvider, localStackAllocator))
         .build();
@@ -130,6 +131,7 @@
                 eventConsumer,
                 ignore, // context
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 desugarMakeConcatWithConstantsInstructions(
                     invoke, freshLocalProvider, localStackAllocator, context))
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 6f2b1a6..2fbf5d3 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
@@ -73,6 +73,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 createAndCallSyntheticMethod(
                     kinds -> kinds.BACKPORT,
@@ -96,6 +97,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 createAndCallSyntheticMethod(
                     kinds -> kinds.BACKPORT,
@@ -116,6 +118,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) ->
                 createAndCallSyntheticMethod(
                     kinds -> kinds.TWR_CLOSE_RESOURCE,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
index 7d4234a..80f114f4 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/varhandle/VarHandleDesugaring.java
@@ -301,6 +301,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) -> {
               ensureMethodHandlesLookupClass(eventConsumer, context);
               localStackAllocator.allocateLocalStack(2);
@@ -326,6 +327,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) -> {
               ensureMethodHandlesLookupClass(eventConsumer, context);
               // Rewrite MethodHandles.privateLookupIn(class, lookup) to
@@ -351,6 +353,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) -> {
               localStackAllocator.allocateLocalStack(2);
               return ImmutableList.of(
@@ -377,6 +380,7 @@
                 eventConsumer,
                 context,
                 methodProcessingContext,
+                desugaringCollection,
                 dexItemFactory) -> {
               ensureVarHandleClass(eventConsumer, context);
               return desugarSignaturePolymorphicMethod(