Remove CfInstructionDesugaring default methods

Bug: b/270021543
Change-Id: Ia2b28a27120a6010ebd92747bf6026ed0285ebee
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 f65d62c..f5db966 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
@@ -5,11 +5,8 @@
 package com.android.tools.r8.ir.desugar;
 
 import com.android.tools.r8.cf.code.CfInstruction;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.ProgramMethod;
-import java.util.Collection;
 
 /** Interface for desugaring a single class-file instruction. */
 public interface CfInstructionDesugaring {
@@ -34,39 +31,6 @@
   }
 
   /**
-   * Given an instruction, returns the list of instructions that the instruction should be desugared
-   * to. If no desugaring is needed, {@code null} should be returned (for efficiency).
-   */
-  default Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
-    return compute(instruction, context)
-        .desugarInstruction(
-            freshLocalProvider,
-            localStackAllocator,
-            eventConsumer,
-            context,
-            methodProcessingContext,
-            desugaringCollection,
-            dexItemFactory);
-  }
-
-  /**
-   * Returns true if the given instruction needs desugaring.
-   *
-   * <p>This should return true if-and-only-if {@link #desugarInstruction} returns non-null.
-   */
-  default boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    return compute(instruction, context).needsDesugaring();
-  }
-
-  /**
    * Returns true if and only if needsDesugaring() answering true implies a desugaring is needed.
    * Some optimizations may have some heuristics, so that needsDesugaring() answers true in rare
    * case even if no desugaring is needed.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index 97216e8..85059be 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -263,13 +263,13 @@
         method.getDefinition().getCode().asCfCode().getInstructions()) {
       for (CfInstructionDesugaring impreciseDesugaring :
           Iterables.filter(desugarings, desugaring -> !desugaring.hasPreciseNeedsDesugaring())) {
-        if (impreciseDesugaring.needsDesugaring(instruction, method)) {
+        if (impreciseDesugaring.compute(instruction, method).needsDesugaring()) {
           foundFalsePositive = true;
         }
       }
       for (CfInstructionDesugaring preciseDesugaring :
           Iterables.filter(desugarings, desugaring -> desugaring.hasPreciseNeedsDesugaring())) {
-        assert !preciseDesugaring.needsDesugaring(instruction, method);
+        assert !preciseDesugaring.compute(instruction, method).needsDesugaring();
       }
     }
     assert foundFalsePositive;
@@ -320,17 +320,17 @@
     while (iterator.hasNext()) {
       CfInstructionDesugaring desugaring = iterator.next();
       Collection<CfInstruction> replacement =
-          desugaring.desugarInstruction(
-              instruction,
-              freshLocalProvider,
-              localStackAllocator,
-              eventConsumer,
-              context,
-              methodProcessingContext,
-              this,
-              appView.dexItemFactory());
+          desugaring
+              .compute(instruction, context)
+              .desugarInstruction(
+                  freshLocalProvider,
+                  localStackAllocator,
+                  eventConsumer,
+                  context,
+                  methodProcessingContext,
+                  this,
+                  appView.dexItemFactory());
       if (replacement != null) {
-        assert desugaring.needsDesugaring(instruction, context);
         assert verifyNoOtherDesugaringNeeded(instruction, context, iterator, desugaring);
         return replacement;
       }
@@ -359,9 +359,10 @@
 
   private boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
     return Iterables.any(
-            desugarings, desugaring -> desugaring.needsDesugaring(instruction, context))
+            desugarings, desugaring -> desugaring.compute(instruction, context).needsDesugaring())
         || Iterables.any(
-            yieldingDesugarings, desugaring -> desugaring.needsDesugaring(instruction, context));
+            yieldingDesugarings,
+            desugaring -> desugaring.compute(instruction, context).needsDesugaring());
   }
 
   private boolean verifyNoOtherDesugaringNeeded(
@@ -371,7 +372,7 @@
       CfInstructionDesugaring appliedDesugaring) {
     iterator.forEachRemaining(
         desugaring -> {
-          boolean alsoApplicable = desugaring.needsDesugaring(instruction, context);
+          boolean alsoApplicable = desugaring.compute(instruction, context).needsDesugaring();
           // TODO(b/187913003): As part of precise interface desugaring, make sure the
           //  identification is explicitly non-overlapping and remove the exceptions below.
           assert !alsoApplicable
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 b62d335..2e14022 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
@@ -26,7 +26,6 @@
 import com.android.tools.r8.errors.UnsupportedInvokePolymorphicMethodHandleDiagnostic;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
@@ -41,7 +40,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Sets;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
 import org.objectweb.asm.Opcodes;
@@ -366,7 +364,8 @@
     matchers = builder.build();
   }
 
-  private DesugarDescription compute(CfInstruction instruction) {
+  @Override
+  public DesugarDescription compute(CfInstruction instruction, ProgramMethod context) {
     for (InstructionMatcher matcher : matchers) {
       DesugarDescription result = matcher.compute(instruction);
       if (result != null) {
@@ -375,30 +374,4 @@
     }
     return DesugarDescription.nothing();
   }
-
-  @Override
-  public Collection<CfInstruction> desugarInstruction(
-      CfInstruction instruction,
-      FreshLocalProvider freshLocalProvider,
-      LocalStackAllocator localStackAllocator,
-      CfInstructionDesugaringEventConsumer eventConsumer,
-      ProgramMethod context,
-      MethodProcessingContext methodProcessingContext,
-      CfInstructionDesugaringCollection desugaringCollection,
-      DexItemFactory dexItemFactory) {
-    return compute(instruction)
-        .desugarInstruction(
-            freshLocalProvider,
-            localStackAllocator,
-            eventConsumer,
-            context,
-            methodProcessingContext,
-            desugaringCollection,
-            dexItemFactory);
-  }
-
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    return compute(instruction).needsDesugaring();
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index e750e9f..292a3b3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -184,7 +184,7 @@
 
   private boolean isAlreadyDesugared(CfInvoke invoke, ProgramMethod context) {
     return Iterables.any(
-        precedingDesugarings, desugaring -> desugaring.needsDesugaring(invoke, context));
+        precedingDesugarings, desugaring -> desugaring.compute(invoke, context).needsDesugaring());
   }
 
   public static DexMethod methodWithVivifiedTypeInSignature(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
index 5c956aa..cf713d7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/disabledesugarer/DesugaredLibraryDisableDesugarer.java
@@ -8,20 +8,14 @@
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.cf.code.CfInvoke;
 import com.android.tools.r8.cf.code.CfTypeInstruction;
-import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexField;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 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 java.util.Collection;
-import java.util.Collections;
+import com.android.tools.r8.ir.desugar.DesugarDescription;
+import com.google.common.collect.ImmutableList;
 
 /**
  * Disables the rewriting of types in specific classes declared in the desugared library
@@ -44,22 +38,25 @@
   }
 
   @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) {
     CfInstruction replacement = rewriteInstruction(instruction, context);
-    return replacement == null ? null : Collections.singleton(replacement);
+    if (replacement == null) {
+      return DesugarDescription.nothing();
+    }
+    return compute(replacement);
   }
 
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    return rewriteInstruction(instruction, context) != null;
+  private DesugarDescription compute(CfInstruction replacement) {
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context,
+                methodProcessingContext,
+                desugaringCollection,
+                dexItemFactory) -> ImmutableList.of(replacement))
+        .build();
   }
 
   // TODO(b/261024278): Share this code.
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 ce4afdd..7695f1d 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
@@ -197,7 +197,7 @@
 
   private boolean isAlreadyDesugared(CfInvoke invoke, ProgramMethod context) {
     return Iterables.any(
-        precedingDesugarings, desugaring -> desugaring.needsDesugaring(invoke, context));
+        precedingDesugarings, desugaring -> desugaring.compute(invoke, context).needsDesugaring());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index e5cb38c..91b7639 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -288,7 +288,8 @@
     }
 
     return Iterables.any(
-        code.asCfCode().getInstructions(), instruction -> needsDesugaring(instruction, method));
+        code.asCfCode().getInstructions(),
+        instruction -> compute(instruction, method).needsDesugaring());
   }
 
   public boolean needsDesugaring(DexMember<?, ?> memberReference, ProgramMethod context) {
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 cc5e605..4e982d8 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
@@ -101,7 +101,7 @@
       ProgramAdditions programAdditions) {
     CfCode cfCode = method.getDefinition().getCode().asCfCode();
     for (CfInstruction instruction : cfCode.getInstructions()) {
-      if (instruction.isInvokeDynamic() && needsDesugaring(instruction, method)) {
+      if (instruction.isInvokeDynamic() && compute(instruction, method).needsDesugaring()) {
         prepareInvokeDynamicOnRecord(
             instruction.asInvokeDynamic(), programAdditions, method, eventConsumer);
       }
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 994d47f..158c97d 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
@@ -234,11 +234,6 @@
     return builder.desugar(localStackAllocator);
   }
 
-  @Override
-  public boolean needsDesugaring(CfInstruction instruction, ProgramMethod context) {
-    return isStringConcatInvoke(instruction, factory);
-  }
-
   public static boolean isStringConcatInvoke(CfInstruction instruction, DexItemFactory factory) {
     CfInvokeDynamic invoke = instruction.asInvokeDynamic();
     if (invoke == null) {