Rewrite RecordDesugaring to use DesugaringDescription

Fixes: b/270144320
Change-Id: I8afebc1be4c24f527c9829cd222bb7389d8576e9
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
index 2140c13..ffbea66 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordDesugaring.java
@@ -41,11 +41,10 @@
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaring;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
 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.CfPostProcessingDesugaring;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.FreshLocalProvider;
+import com.android.tools.r8.ir.desugar.DesugarDescription;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.desugar.ProgramAdditions;
 import com.android.tools.r8.ir.desugar.records.RecordDesugaringEventConsumer.RecordClassSynthesizerDesugaringEventConsumer;
@@ -171,34 +170,52 @@
   }
 
   @Override
-  public Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
-    assert !instruction.isInitClass();
-    if (!needsDesugaring(instruction, context)) {
-      return null;
-    }
+  public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     if (instruction.isInvokeDynamic()) {
-      return desugarInvokeDynamicOnRecord(
-          instruction.asInvokeDynamic(),
-          localStackAllocator,
-          eventConsumer,
-          context,
-          methodProcessingContext);
+      if (needsDesugaring(instruction.asInvokeDynamic(), context)) {
+        return DesugarDescription.builder()
+            .setDesugarRewrite(
+                (freshLocalProvider,
+                    localStackAllocator,
+                    eventConsumer,
+                    ignore, // context
+                    methodProcessingContext,
+                    desugaringCollection,
+                    dexItemFactory) ->
+                    desugarInvokeDynamicOnRecord(
+                        instruction.asInvokeDynamic(),
+                        localStackAllocator,
+                        eventConsumer,
+                        context,
+                        methodProcessingContext))
+            .build();
+      } else {
+        return DesugarDescription.nothing();
+      }
     }
-    assert instruction.isInvoke();
-    CfInvoke cfInvoke = instruction.asInvoke();
-    DexMethod newMethod =
-        rewriteMethod(cfInvoke.getMethod(), cfInvoke.isInvokeSuper(context.getHolderType()));
-    assert newMethod != cfInvoke.getMethod();
-    return Collections.singletonList(
-        new CfInvoke(cfInvoke.getOpcode(), newMethod, cfInvoke.isInterface()));
+    if (instruction.isInvoke()) {
+      CfInvoke cfInvoke = instruction.asInvoke();
+      if (needsDesugaring(cfInvoke.getMethod(), cfInvoke.isInvokeSuper(context.getHolderType()))) {
+        DexMethod newMethod =
+            rewriteMethod(cfInvoke.getMethod(), cfInvoke.isInvokeSuper(context.getHolderType()));
+        assert newMethod != cfInvoke.getMethod();
+        return DesugarDescription.builder()
+            .setDesugarRewrite(
+                (freshLocalProvider,
+                    localStackAllocator,
+                    eventConsumer,
+                    ignore, // context
+                    methodProcessingContext,
+                    desugaringCollection,
+                    dexItemFactory) ->
+                    Collections.singletonList(
+                        new CfInvoke(cfInvoke.getOpcode(), newMethod, cfInvoke.isInterface())))
+            .build();
+      } else {
+        return DesugarDescription.nothing();
+      }
+    }
+    return DesugarDescription.nothing();
   }
 
   private List<CfInstruction> desugarInvokeDynamicOnRecord(
@@ -389,18 +406,6 @@
     return instructions;
   }
 
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    if (instruction.isInvokeDynamic()) {
-      return needsDesugaring(instruction.asInvokeDynamic(), context);
-    }
-    if (instruction.isInvoke()) {
-      CfInvoke cfInvoke = instruction.asInvoke();
-      return needsDesugaring(cfInvoke.getMethod(), cfInvoke.isInvokeSuper(context.getHolderType()));
-    }
-    return false;
-  }
-
   private void ensureRecordClass(
       RecordInstructionDesugaringEventConsumer eventConsumer, ProgramMethod context) {
     DexProgramClass recordTagClass =