Account for library desugaring in D8 backporting of R8 partial

Bug: b/391572031
Change-Id: Iddfb1976c529e142da5e8620c64b2da62578b061
diff --git a/src/main/java/com/android/tools/r8/R8Partial.java b/src/main/java/com/android/tools/r8/R8Partial.java
index e874dc8..56b1730 100644
--- a/src/main/java/com/android/tools/r8/R8Partial.java
+++ b/src/main/java/com/android/tools/r8/R8Partial.java
@@ -120,7 +120,8 @@
     InternalOptions d8Options = d8Command.getInternalOptions();
     options.partialCompilationConfiguration.d8DexOptionsConsumer.accept(d8Options);
     R8PartialD8SubCompilationConfiguration subCompilationConfiguration =
-        new R8PartialD8SubCompilationConfiguration(input.getD8Types(), input.getR8Types(), timing);
+        new R8PartialD8SubCompilationConfiguration(
+            input.getD8Types(), input.getR8Types(), options.getLibraryDesugaringOptions(), timing);
     d8Options.setArtProfileOptions(
         new ArtProfileOptions(d8Options, options.getArtProfileOptions()));
     d8Options.setFeatureSplitConfiguration(options.getFeatureSplitConfiguration());
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 1ff5fe1..6399485 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
@@ -1,7 +1,6 @@
 // Copyright (c) 2018, 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.androidapi.ComputedApiLevel;
@@ -94,11 +93,13 @@
 public final class BackportedMethodRewriter implements CfInstructionDesugaring {
 
   private final AppView<?> appView;
+  private final LibraryDesugaringOptions libraryDesugaringOptions;
   private final RewritableMethods rewritableMethods;
 
   public BackportedMethodRewriter(AppView<?> appView) {
     assert appView.options().desugarState.isOn();
     this.appView = appView;
+    this.libraryDesugaringOptions = appView.options().getSubCompilationLibraryDesugaringOptions();
     this.rewritableMethods = new RewritableMethods(appView);
   }
 
@@ -217,8 +218,7 @@
     AppInfo appInfo =
         AppInfo.createInitialAppInfo(app, GlobalSyntheticsStrategy.forNonSynthesizing());
     AppView<?> appView = AppView.createForD8(appInfo, Timing.empty());
-    BackportedMethodRewriter.RewritableMethods rewritableMethods =
-        new BackportedMethodRewriter.RewritableMethods(appView);
+    RewritableMethods rewritableMethods = new RewritableMethods(appView);
     rewritableMethods.visit(methods);
     new DesugaredLibraryRetargeterHelper(appView).visit(methods);
     new AutoCloseableRetargeterHelper(options.getMinApiLevel(), options.dexItemFactory())
@@ -241,13 +241,9 @@
     // maintained for legacy only, recent desugared library should not be shipped with
     // pre-desugared code.
     Map<DexType, DexType> legacyBackport =
-        appView
-            .options()
-            .getLibraryDesugaringOptions()
-            .getMachineDesugaredLibrarySpecification()
-            .getLegacyBackport();
+        libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().getLegacyBackport();
     if (provider == null
-        && appView.options().getLibraryDesugaringOptions().isDesugaredLibraryCompilation()
+        && libraryDesugaringOptions.isDesugaredLibraryCompilation()
         && legacyBackport.containsKey(method.holder)) {
       DexType newHolder = legacyBackport.get(method.holder);
       DexMethod backportedMethod =
@@ -277,8 +273,7 @@
   }
 
   private MethodProvider<DexField> getProviderOrNull(DexField field) {
-    MethodProvider<DexField> provider = rewritableMethods.getProvider(field);
-    return provider;
+    return rewritableMethods.getProvider(field);
   }
 
   private static final class RewritableMethods {
@@ -286,6 +281,7 @@
     private final Map<DexType, AndroidApiLevel> typeMinApi;
 
     private final AppView<?> appView;
+    private final LibraryDesugaringOptions libraryDesugaringOptions;
 
     // Map backported field or method to a provider for creating the actual target method
     // (with code).
@@ -298,6 +294,7 @@
       InternalOptions options = appView.options();
       DexItemFactory factory = options.dexItemFactory();
       this.appView = appView;
+      this.libraryDesugaringOptions = options.getSubCompilationLibraryDesugaringOptions();
       this.typeMinApi = initializeTypeMinApi(factory);
       if (!options.enableBackportedMethodRewriting()) {
         return;
@@ -410,8 +407,6 @@
     }
 
     private boolean typeIsInDesugaredLibrary(DexType type) {
-      LibraryDesugaringOptions libraryDesugaringOptions =
-          appView.options().getLibraryDesugaringOptions();
       return libraryDesugaringOptions.getTypeRewriter().hasRewrittenType(type)
           || libraryDesugaringOptions
               .getMachineDesugaredLibrarySpecification()
@@ -436,9 +431,7 @@
       if (typeIsInDesugaredLibrary(type)) {
         // Desugared library is enabled, the methods are present if desugared library specifies it.
         return methodsMinAPI.isGreaterThan(AndroidApiLevel.N)
-            && !appView
-                .options()
-                .getLibraryDesugaringOptions()
+            && !libraryDesugaringOptions
                 .getMachineDesugaredLibrarySpecification()
                 .includesJDK11Methods();
       }
@@ -2224,8 +2217,7 @@
         BackportedMethodDesugaringEventConsumer eventConsumer,
         MethodProcessingContext methodProcessingContext,
         LocalStackAllocator localStackAllocator) {
-      return rewriter.rewrite(
-          instruction.asStaticFieldGet(), appView.dexItemFactory(), localStackAllocator);
+      return rewriter.rewrite(instruction.asStaticFieldGet(), appView.dexItemFactory());
     }
   }
 
@@ -2530,10 +2522,7 @@
     CfInstruction rewriteSingle(CfStaticFieldRead staticGet, DexItemFactory factory);
 
     // Convenience wrapper since most rewrites are to a single instruction.
-    default Collection<CfInstruction> rewrite(
-        CfStaticFieldRead staticGet,
-        DexItemFactory factory,
-        LocalStackAllocator localStackAllocator) {
+    default Collection<CfInstruction> rewrite(CfStaticFieldRead staticGet, DexItemFactory factory) {
       return ImmutableList.of(rewriteSingle(staticGet, factory));
     }
   }
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
index 5e82a63..a5cd867 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.graph.ProgramDefinition;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions.Target;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.LibraryDesugaringOptions;
 import com.android.tools.r8.keepanno.ast.KeepDeclaration;
 import com.android.tools.r8.profile.art.ArtProfile;
 import com.android.tools.r8.profile.art.ArtProfileCollection;
@@ -65,6 +66,7 @@
 
     private final Set<DexType> d8Types;
     private final Set<DexType> r8Types;
+    private final LibraryDesugaringOptions libraryDesugaringOptions;
 
     private ArtProfileCollection artProfiles;
     private ClassToFeatureSplitMap classToFeatureSplitMap;
@@ -75,10 +77,14 @@
     private StartupProfile startupProfile;
 
     public R8PartialD8SubCompilationConfiguration(
-        Set<DexType> d8Types, Set<DexType> r8Types, Timing timing) {
+        Set<DexType> d8Types,
+        Set<DexType> r8Types,
+        LibraryDesugaringOptions libraryDesugaringOptions,
+        Timing timing) {
       super(timing);
       this.d8Types = d8Types;
       this.r8Types = r8Types;
+      this.libraryDesugaringOptions = libraryDesugaringOptions;
     }
 
     public ArtProfileCollection getArtProfiles() {
@@ -100,6 +106,10 @@
       return desugaredOutputClasses;
     }
 
+    public LibraryDesugaringOptions getLibraryDesugaringOptions() {
+      return libraryDesugaringOptions;
+    }
+
     public Collection<DexClasspathClass> getOutputClasspathClasses() {
       assert outputClasspathClasses != null;
       return outputClasspathClasses;
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 74b8fd1..dd600b2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1082,6 +1082,18 @@
     return libraryDesugaringOptions;
   }
 
+  /**
+   * Similar to {@link #getLibraryDesugaringOptions()}, except for the D8 compilation in R8 partial,
+   * where this deliberately returns the library desugaring options of the outer R8 partial
+   * compilation.
+   */
+  public LibraryDesugaringOptions getSubCompilationLibraryDesugaringOptions() {
+    if (partialSubCompilationConfiguration != null && partialSubCompilationConfiguration.isD8()) {
+      return partialSubCompilationConfiguration.asD8().getLibraryDesugaringOptions();
+    }
+    return getLibraryDesugaringOptions();
+  }
+
   public SingleCallerInlinerOptions getSingleCallerInlinerOptions() {
     return singleCallerInlinerOptions;
   }