Wrap desugaring collection in D8

This refactors the desugaring collection in D8 so that a wrapper around the desugaring collection returns the underlying desugaring collection given the class/method that is about to be desugared.

This will allow returning different desugaring collections based on the class/method being desugared, which will be used in the D8 step of R8 partial, to apply different desugarings to the D8 part and R8 part.

Bug: b/391572031
Change-Id: I050cf51a40df816313b94f17ccd5eb39a8c688a7
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 42af1e9..cbbe820 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -40,7 +40,7 @@
 import com.android.tools.r8.ir.conversion.passes.StringSwitchRemover;
 import com.android.tools.r8.ir.conversion.passes.ThrowCatchOptimizer;
 import com.android.tools.r8.ir.conversion.passes.TrivialPhiSimplifier;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
+import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollectionSupplier;
 import com.android.tools.r8.ir.optimize.AssertionErrorTwoArgsConstructorRewriter;
 import com.android.tools.r8.ir.optimize.AssertionsRewriter;
 import com.android.tools.r8.ir.optimize.AssumeInserter;
@@ -107,7 +107,7 @@
   public final Outliner outliner;
   protected final CodeRewriterPassCollection rewriterPassCollection;
   private final ClassInitializerDefaultsOptimization classInitializerDefaultsOptimization;
-  protected final CfInstructionDesugaringCollection instructionDesugaring;
+  protected final CfInstructionDesugaringCollectionSupplier instructionDesugaring;
   protected FieldAccessAnalysis fieldAccessAnalysis;
   protected final LibraryMethodOverrideAnalysis libraryMethodOverrideAnalysis;
   protected final IdempotentFunctionCallCanonicalizer idempotentFunctionCallCanonicalizer;
@@ -186,8 +186,7 @@
       // - nest based access desugaring,
       // - invoke-special desugaring.
       assert options.desugarState.isOn();
-      this.instructionDesugaring =
-          CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+      this.instructionDesugaring = CfInstructionDesugaringCollectionSupplier.createForL8(appView);
       this.dynamicTypeOptimization = null;
       this.classInliner = null;
       this.fieldAccessAnalysis = null;
@@ -208,8 +207,8 @@
     }
     this.instructionDesugaring =
         appView.enableWholeProgramOptimizations()
-            ? CfInstructionDesugaringCollection.empty()
-            : CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+            ? CfInstructionDesugaringCollectionSupplier.empty()
+            : CfInstructionDesugaringCollectionSupplier.createForD8(appView);
     removeVerificationErrorForUnknownReturnedValues =
         (appView.options().apiModelingOptions().isApiModelingEnabled()
                 && appView.options().canHaveVerifyErrorForUnknownUnusedReturnValue())
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
index 57e3cc6..d2b3868 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.ir.conversion;
 
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
 import static com.android.tools.r8.ir.desugar.lambda.D8LambdaDesugaring.rewriteEnclosingLambdaMethodAttributes;
 
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
@@ -21,17 +20,16 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringCollection;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringCollection;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.ProgramAdditions;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceApplicationRewriter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
 import com.android.tools.r8.ir.desugar.itf.L8InnerOuterAttributeEraser;
 import com.android.tools.r8.ir.desugar.lambda.LambdaDeserializationMethodRemover;
-import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
@@ -69,8 +67,7 @@
 
     convertClasses(methodProcessor, interfaceProcessor, executorService);
 
-    reportNestDesugarDependencies();
-    clearNestAttributes();
+    instructionDesugaring.finalizeNestDesugaring();
 
     application = commitPendingSyntheticItems(appView, application);
 
@@ -281,7 +278,8 @@
 
     // The synthesis of accessibility bridges in nest based access desugaring will schedule and
     // await the processing of synthesized methods.
-    synthesizeBridgesForNestBasedAccessesOnClasspath(methodProcessor, executorService);
+    instructionDesugaring.processClasspath(methodProcessor, executorService);
+    methodProcessor.awaitMethodProcessing();
 
     // There should be no outstanding method processing.
     methodProcessor.verifyNoPendingMethodProcessing();
@@ -289,8 +287,7 @@
     rewriteEnclosingLambdaMethodAttributes(
         appView, classConverterResult.getForcefullyMovedLambdaMethods());
 
-    instructionDesugaring.withDesugaredLibraryAPIConverter(
-        DesugaredLibraryAPIConverter::generateTrackingWarnings);
+    instructionDesugaring.generateDesugaredLibraryApiConverterTrackingWarnings();
   }
 
   private void postProcessingDesugaringForD8(
@@ -306,8 +303,7 @@
             instructionDesugaring);
     methodProcessor.newWave();
     InterfaceMethodProcessorFacade interfaceDesugaring =
-        instructionDesugaring.getInterfaceMethodPostProcessingDesugaringD8(
-            ExcludeDexResources, interfaceProcessor);
+        instructionDesugaring.getInterfaceMethodProcessorFacade(interfaceProcessor);
     CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring, m -> true)
         .postProcessingDesugaring(appView.appInfo().classes(), eventConsumer, executorService);
     methodProcessor.awaitMethodProcessing();
@@ -323,10 +319,13 @@
     ThreadUtils.processItems(
         appView.appInfo().classes(),
         clazz -> {
+          CfInstructionDesugaringCollection instructionDesugaringForClass =
+              instructionDesugaring.get(clazz);
           clazz.forEachProgramMethodMatching(
               method -> method.hasCode() && method.getCode().isCfCode(),
               method ->
-                  instructionDesugaring.prepare(method, desugaringEventConsumer, programAdditions));
+                  instructionDesugaringForClass.prepare(
+                      method, desugaringEventConsumer, programAdditions));
         },
         threadingModule,
         executorService);
@@ -383,31 +382,14 @@
     if (!method.getDefinition().getCode().isCfCode()) {
       return false;
     }
-    instructionDesugaring.scan(method, desugaringEventConsumer);
-    if (instructionDesugaring.needsDesugaring(method)) {
-      instructionDesugaring.desugar(method, methodProcessingContext, desugaringEventConsumer);
+    CfInstructionDesugaringCollection instructionDesugaringForMethod =
+        instructionDesugaring.get(method);
+    instructionDesugaringForMethod.scan(method, desugaringEventConsumer);
+    if (instructionDesugaringForMethod.needsDesugaring(method)) {
+      instructionDesugaringForMethod.desugar(
+          method, methodProcessingContext, desugaringEventConsumer);
       return true;
     }
     return false;
   }
-
-  private void clearNestAttributes() {
-    instructionDesugaring.withD8NestBasedAccessDesugaring(
-        D8NestBasedAccessDesugaring::clearNestAttributes);
-  }
-
-  private void reportNestDesugarDependencies() {
-    instructionDesugaring.withD8NestBasedAccessDesugaring(
-        D8NestBasedAccessDesugaring::reportDesugarDependencies);
-  }
-
-  private void synthesizeBridgesForNestBasedAccessesOnClasspath(
-      D8MethodProcessor methodProcessor, ExecutorService executorService)
-      throws ExecutionException {
-    instructionDesugaring.withD8NestBasedAccessDesugaring(
-        d8NestBasedAccessDesugaring ->
-            d8NestBasedAccessDesugaring.synthesizeBridgesForNestBasedAccessesOnClasspath(
-                methodProcessor, executorService));
-    methodProcessor.awaitMethodProcessing();
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index 5357748..5ecdabc 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -56,9 +56,6 @@
   private DexApplication internalOptimize(
       AppView<AppInfoWithLiveness> appView, ExecutorService executorService)
       throws ExecutionException {
-    // Desugaring happens in the enqueuer.
-    assert instructionDesugaring.isEmpty();
-
     workaroundAbstractMethodOnNonAbstractClassVerificationBug(executorService);
 
     // The process is in two phases in general.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index 97f2d27..567fd16 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.ir.desugar;
 
-import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
 import com.android.tools.r8.cf.code.CfInstruction;
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.errors.CompilationError;
@@ -13,12 +12,13 @@
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
 import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import java.util.Collection;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 
 /**
@@ -29,22 +29,20 @@
  */
 public abstract class CfInstructionDesugaringCollection {
 
-  public static CfInstructionDesugaringCollection create(
-      AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
+  public static CfInstructionDesugaringCollection create(AppView<?> appView) {
     if (appView.options().desugarState.isOff() && appView.options().forceNestDesugaring) {
       throw new CompilationError(
           "Cannot combine -Dcom.android.tools.r8.forceNestDesugaring with desugaring turned off");
     }
     if (appView.options().desugarState.isOn()) {
-      return new NonEmptyCfInstructionDesugaringCollection(appView, apiLevelCompute);
+      return new NonEmptyCfInstructionDesugaringCollection(appView);
     }
     // TODO(b/145775365): invoke-special desugaring is mandatory, since we currently can't map
     //  invoke-special instructions that require desugaring into IR.
     if (appView.options().isGeneratingClassFiles()) {
       return NonEmptyCfInstructionDesugaringCollection.createForCfToCfNonDesugar(appView);
     }
-    return NonEmptyCfInstructionDesugaringCollection.createForCfToDexNonDesugar(
-        appView, apiLevelCompute);
+    return NonEmptyCfInstructionDesugaringCollection.createForCfToDexNonDesugar(appView);
   }
 
   public static CfInstructionDesugaringCollection empty() {
@@ -86,12 +84,11 @@
   public abstract <T extends Throwable> void withD8NestBasedAccessDesugaring(
       ThrowingConsumer<D8NestBasedAccessDesugaring, T> consumer) throws T;
 
-  public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
-      Flavor flavor, InterfaceProcessor interfaceProcessor);
-
   public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
-      Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor);
+      Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor);
 
   public abstract void withDesugaredLibraryAPIConverter(
       Consumer<DesugaredLibraryAPIConverter> consumer);
+
+  public abstract <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn);
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java
new file mode 100644
index 0000000..12f22de
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java
@@ -0,0 +1,120 @@
+// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.desugar;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ProgramDefinition;
+import com.android.tools.r8.ir.conversion.D8MethodProcessor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
+import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+
+public interface CfInstructionDesugaringCollectionSupplier {
+
+  CfInstructionDesugaringCollectionSupplier EMPTY =
+      new EmptyCfInstructionDesugaringCollectionSupplier();
+
+  CfInstructionDesugaringCollection get(ProgramDefinition definition);
+
+  void finalizeNestDesugaring();
+
+  void generateDesugaredLibraryApiConverterTrackingWarnings();
+
+  InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+      InterfaceProcessor interfaceProcessor);
+
+  void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor)
+      throws ExecutionException;
+
+  static CfInstructionDesugaringCollectionSupplier createForD8(AppView<?> appView) {
+    return new DefaultCfInstructionDesugaringCollectionSupplier(appView);
+  }
+
+  static CfInstructionDesugaringCollectionSupplier createForL8(AppView<?> appView) {
+    return new DefaultCfInstructionDesugaringCollectionSupplier(appView);
+  }
+
+  static CfInstructionDesugaringCollectionSupplier empty() {
+    return EMPTY;
+  }
+
+  class DefaultCfInstructionDesugaringCollectionSupplier
+      implements CfInstructionDesugaringCollectionSupplier {
+
+    private final CfInstructionDesugaringCollection desugaring;
+
+    DefaultCfInstructionDesugaringCollectionSupplier(AppView<?> appView) {
+      this.desugaring = CfInstructionDesugaringCollection.create(appView);
+    }
+
+    @Override
+    public CfInstructionDesugaringCollection get(ProgramDefinition target) {
+      return desugaring;
+    }
+
+    @Override
+    public void finalizeNestDesugaring() {
+      desugaring.withD8NestBasedAccessDesugaring(
+          nestBasedAccessDesugaring -> {
+            nestBasedAccessDesugaring.reportDesugarDependencies();
+            nestBasedAccessDesugaring.clearNestAttributes();
+          });
+    }
+
+    @Override
+    public void generateDesugaredLibraryApiConverterTrackingWarnings() {
+      desugaring.withDesugaredLibraryAPIConverter(
+          DesugaredLibraryAPIConverter::generateTrackingWarnings);
+    }
+
+    @Override
+    public InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+        InterfaceProcessor interfaceProcessor) {
+      return desugaring.withInterfaceMethodRewriter(
+          interfaceMethodRewriter ->
+              interfaceMethodRewriter.getPostProcessingDesugaringD8(interfaceProcessor));
+    }
+
+    @Override
+    public void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor)
+        throws ExecutionException {
+      desugaring.withD8NestBasedAccessDesugaring(
+          nestBasedAccessDesugaring ->
+              nestBasedAccessDesugaring.synthesizeBridgesForNestBasedAccessesOnClasspath(
+                  methodProcessor, executor));
+    }
+  }
+
+  class EmptyCfInstructionDesugaringCollectionSupplier
+      implements CfInstructionDesugaringCollectionSupplier {
+
+    @Override
+    public CfInstructionDesugaringCollection get(ProgramDefinition target) {
+      return CfInstructionDesugaringCollection.empty();
+    }
+
+    @Override
+    public void finalizeNestDesugaring() {
+      // Intentionally empty.
+    }
+
+    @Override
+    public void generateDesugaredLibraryApiConverterTrackingWarnings() {
+      // Intentionally empty.
+    }
+
+    @Override
+    public InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+        InterfaceProcessor interfaceProcessor) {
+      return null;
+    }
+
+    @Override
+    public void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor) {
+      // Intentionally empty.
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
index 1a232e1..9cdb6e6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
@@ -41,7 +41,7 @@
       AppView<?> appView,
       ProfileCollectionAdditions profileCollectionAdditions,
       D8MethodProcessor methodProcessor,
-      CfInstructionDesugaringCollection instructionDesugaring) {
+      CfInstructionDesugaringCollectionSupplier instructionDesugaring) {
     CfPostProcessingDesugaringEventConsumer eventConsumer =
         new D8CfPostProcessingDesugaringEventConsumer(methodProcessor, instructionDesugaring);
     return ProfileRewritingCfPostProcessingDesugaringEventConsumer.attach(
@@ -71,17 +71,17 @@
     // Methods cannot be processed directly because we cannot add method to classes while
     // concurrently processing other methods.
     private final ProgramMethodSet methodsToReprocess = ProgramMethodSet.createConcurrent();
-    private final CfInstructionDesugaringCollection instructionDesugaring;
+    private final CfInstructionDesugaringCollectionSupplier instructionDesugaring;
 
     private D8CfPostProcessingDesugaringEventConsumer(
         D8MethodProcessor methodProcessor,
-        CfInstructionDesugaringCollection instructionDesugaring) {
+        CfInstructionDesugaringCollectionSupplier instructionDesugaring) {
       this.methodProcessor = methodProcessor;
       this.instructionDesugaring = instructionDesugaring;
     }
 
     private void addMethodToReprocess(ProgramMethod method) {
-      assert !instructionDesugaring.needsDesugaring(method);
+      assert !instructionDesugaring.get(method).needsDesugaring(method);
       assert method.getDefinition().getCode().isCfCode();
       methodsToReprocess.add(method);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index 46ff0f0..b099cf9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -10,12 +10,13 @@
 import com.android.tools.r8.ir.code.Position;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
 import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import java.util.Collection;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 
 public class EmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -82,14 +83,8 @@
   }
 
   @Override
-  public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
-      Flavor flavor, InterfaceProcessor interfaceProcessor) {
-    return null;
-  }
-
-  @Override
   public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
-      Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
+      Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
     return null;
   }
 
@@ -97,4 +92,9 @@
   public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
     // Intentionally empty.
   }
+
+  @Override
+  public <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn) {
+    return null;
+  }
 }
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 ece7ef6..4442dfe 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
@@ -26,7 +26,6 @@
 import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialToSelfDesugaring;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
 import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
@@ -53,6 +52,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 
 public class NonEmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -70,6 +70,10 @@
 
   private final CfInstructionDesugaring[][] asmOpcodeOrCompareToIdToDesugaringsMap;
 
+  NonEmptyCfInstructionDesugaringCollection(AppView<?> appView) {
+    this(appView, appView.apiLevelCompute());
+  }
+
   NonEmptyCfInstructionDesugaringCollection(
       AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
     this.appView = appView;
@@ -227,11 +231,10 @@
     return new NonEmptyCfInstructionDesugaringCollection(appView, noAndroidApiLevelCompute());
   }
 
-  static NonEmptyCfInstructionDesugaringCollection createForCfToDexNonDesugar(
-      AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
+  static NonEmptyCfInstructionDesugaringCollection createForCfToDexNonDesugar(AppView<?> appView) {
     assert appView.options().desugarState.isOff();
     assert appView.options().isGeneratingDex();
-    return new NonEmptyCfInstructionDesugaringCollection(appView, apiLevelCompute);
+    return new NonEmptyCfInstructionDesugaringCollection(appView);
   }
 
   private void ensureCfCode(ProgramMethod method) {
@@ -533,19 +536,11 @@
   }
 
   @Override
-  public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
-      Flavor flavor, InterfaceProcessor interfaceProcessor) {
-    return interfaceMethodRewriter != null
-        ? interfaceMethodRewriter.getPostProcessingDesugaringD8(flavor, interfaceProcessor)
-        : null;
-  }
-
-  @Override
   public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
-      Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
-    return interfaceMethodRewriter != null
-        ? interfaceMethodRewriter.getPostProcessingDesugaringR8(flavor, isLiveMethod, processor)
-        : null;
+      Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
+    return withInterfaceMethodRewriter(
+        interfaceMethodRewriter ->
+            interfaceMethodRewriter.getPostProcessingDesugaringR8(isLiveMethod, processor));
   }
 
   @Override
@@ -554,4 +549,12 @@
       consumer.accept(desugaredLibraryAPIConverter);
     }
   }
+
+  @Override
+  public <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn) {
+    if (interfaceMethodRewriter != null) {
+      return fn.apply(interfaceMethodRewriter);
+    }
+    return null;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
index 3c3197b..f50a458 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
@@ -4,13 +4,14 @@
 
 package com.android.tools.r8.ir.desugar.itf;
 
+import static com.google.common.base.Predicates.alwaysTrue;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper.InterfaceMethodDesugaringMode;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.ThreadUtils;
 import java.util.Collection;
@@ -21,28 +22,29 @@
 public class InterfaceMethodProcessorFacade implements CfPostProcessingDesugaring {
 
   private final AppView<?> appView;
-  private final Flavor flavour;
   private final InterfaceProcessor interfaceProcessor;
   private final ClassProcessor classProcessor;
 
   InterfaceMethodProcessorFacade(
       AppView<?> appView,
-      Flavor flavour,
-      Predicate<ProgramMethod> isLiveMethod,
       InterfaceProcessor interfaceProcessor,
       InterfaceMethodDesugaringMode desugaringMode) {
+    this(appView, interfaceProcessor, desugaringMode, alwaysTrue());
+  }
+
+  InterfaceMethodProcessorFacade(
+      AppView<?> appView,
+      InterfaceProcessor interfaceProcessor,
+      InterfaceMethodDesugaringMode desugaringMode,
+      Predicate<ProgramMethod> isLiveMethod) {
     this.appView = appView;
-    this.flavour = flavour;
     assert interfaceProcessor != null;
     this.interfaceProcessor = interfaceProcessor;
     this.classProcessor = new ClassProcessor(appView, isLiveMethod, desugaringMode);
   }
 
-  private boolean shouldProcess(DexProgramClass clazz, Flavor flavour) {
-    if (appView.isAlreadyLibraryDesugared(clazz)) {
-      return false;
-    }
-    return (!clazz.originatesFromDexResource() || flavour == Flavor.IncludeAllResources);
+  private boolean shouldProcess(DexProgramClass clazz) {
+    return !appView.isAlreadyLibraryDesugared(clazz) && !clazz.originatesFromDexResource();
   }
 
   private void processClassesConcurrently(
@@ -51,7 +53,7 @@
       ExecutorService executorService)
       throws ExecutionException {
     ThreadUtils.processItems(
-        ListUtils.filter(programClasses, clazz -> shouldProcess(clazz, flavour)),
+        ListUtils.filter(programClasses, this::shouldProcess),
         clazz -> classProcessor.process(clazz, eventConsumer),
         appView.options().getThreadingModule(),
         executorService);
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 003f7dd..bf94859 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
@@ -927,17 +927,15 @@
   }
 
   public InterfaceMethodProcessorFacade getPostProcessingDesugaringD8(
-      Flavor flavour, InterfaceProcessor interfaceProcessor) {
-    return new InterfaceMethodProcessorFacade(
-        appView, flavour, m -> true, interfaceProcessor, desugaringMode);
+      InterfaceProcessor interfaceProcessor) {
+    return new InterfaceMethodProcessorFacade(appView, interfaceProcessor, desugaringMode);
   }
 
   public InterfaceMethodProcessorFacade getPostProcessingDesugaringR8(
-      Flavor flavour,
       Predicate<ProgramMethod> isLiveMethod,
       InterfaceProcessor interfaceProcessor) {
     return new InterfaceMethodProcessorFacade(
-        appView, flavour, isLiveMethod, interfaceProcessor, desugaringMode);
+        appView, interfaceProcessor, desugaringMode, isLiveMethod);
   }
 
   private Origin getMethodOrigin(DexMethod method) {
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index a47ffa7..86724f3 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -7,7 +7,6 @@
 import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
 import static com.android.tools.r8.graph.FieldAccessInfoImpl.MISSING_FIELD_ACCESS_INFO;
 import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafactoryMethod;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentifier;
 import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
 import static com.android.tools.r8.shaking.KeepInfo.Joiner.asClassJoinerOrNull;
@@ -567,7 +566,7 @@
     liveMethods = new LiveMethodsSet(graphReporter::registerMethod);
     liveFields = new LiveFieldsSet(graphReporter::registerField);
     if (mode.isInitialTreeShaking()) {
-      desugaring = CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+      desugaring = CfInstructionDesugaringCollection.create(appView);
       interfaceProcessor = InterfaceProcessor.create(appView);
     } else {
       desugaring = CfInstructionDesugaringCollection.empty();
@@ -4931,7 +4930,7 @@
                         null)));
     InterfaceMethodProcessorFacade interfaceDesugaring =
         desugaring.getInterfaceMethodPostProcessingDesugaringR8(
-            ExcludeDexResources, liveMethods::contains, interfaceProcessor);
+            liveMethods::contains, interfaceProcessor);
     CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring, liveMethods::contains)
         .postProcessingDesugaring(liveTypes.items, eventConsumer, executorService);