Desugared library: L8 desugaring only cf to cf

- L8 second phase (D8/R8) is now run with
  Desugaring turned off.

Bug: 170698191
Change-Id: I323b31f6c2434a1d398df50fccb4af29532c12c6
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 221df4c..1141688 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -316,6 +316,7 @@
         r8Builder.addProguardConfiguration(
             libraryConfiguration.getExtraKeepRules(), Origin.unknown());
         r8Builder.addProguardConfigurationFiles(proguardConfigFiles);
+        r8Builder.setDisableDesugaring(true);
         r8Command = r8Builder.makeCommand();
       } else if (!(getProgramConsumer() instanceof ClassFileConsumer)) {
         l8CfConsumer = new InMemoryJarContent();
@@ -333,6 +334,7 @@
             inputs.getLibraryResourceProviders()) {
           d8Builder.addLibraryResourceProvider(libraryResourceProvider);
         }
+        d8Builder.setDisableDesugaring(true);
         d8Command = d8Builder.makeCommand();
       } else {
         assert getProgramConsumer() instanceof ClassFileConsumer;
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 c271af1..7303dd1 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
@@ -214,13 +214,18 @@
             .map(options.itemFactory::createString)
             .collect(Collectors.toList());
     if (options.isDesugaredLibraryCompilation()) {
-      // Specific L8 Settings.
-      // DesugaredLibraryRetargeter is needed for retarget core library members and backports.
-      // InterfaceMethodRewriter is needed for emulated interfaces.
-      // LambdaRewriter is needed because if it is missing there are invoke custom on
-      // default/static interface methods, and this is not supported by the compiler.
-      // DesugaredLibraryAPIConverter is here to duplicate APIs.
-      // The rest is nulled out. In addition the rewriting logic fails without lambda rewriting.
+      // Specific L8 Settings, performs all desugaring including L8 specific desugaring.
+      // The following desugaring are required for L8 specific desugaring:
+      // - DesugaredLibraryRetargeter for retarget core library members.
+      // - InterfaceMethodRewriter for emulated interfaces,
+      // - LambdaRewriter since InterfaceMethodDesugaring does not support invokeCustom rewriting,
+      // - DesugaredLibraryAPIConverter to duplicate APIs.
+      // The following desugaring are present so all desugaring is performed cf to cf in L8, and
+      // the second L8 phase can just run with Desugar turned off:
+      // - InterfaceMethodRewriter for non L8 specific interface method desugaring,
+      // - TwrCloseResourceRewriter,
+      // - NestBaseAccessDesugaring.
+      assert options.desugarState == DesugarState.ON;
       this.desugaredLibraryRetargeter =
           options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()
               ? null
@@ -232,11 +237,11 @@
       this.lambdaRewriter = new LambdaRewriter(appView);
       this.desugaredLibraryAPIConverter =
           new DesugaredLibraryAPIConverter(appView, Mode.GENERATE_CALLBACKS_AND_WRAPPERS);
-      this.backportedMethodRewriter =
-          options.cfToCfDesugar || options.testing.forceLibBackportsInL8CfToCf
-              ? new BackportedMethodRewriter(appView)
-              : null;
-      this.twrCloseResourceRewriter = null;
+      this.backportedMethodRewriter = new BackportedMethodRewriter(appView);
+      this.twrCloseResourceRewriter =
+          enableTwrCloseResourceDesugaring() ? new TwrCloseResourceRewriter(appView, this) : null;
+      this.d8NestBasedAccessDesugaring =
+          options.shouldDesugarNests() ? new D8NestBasedAccessDesugaring(appView) : null;
       this.lambdaMerger = null;
       this.covariantReturnTypeAnnotationTransformer = null;
       this.dynamicTypeOptimization = null;
@@ -251,7 +256,6 @@
       this.identifierNameStringMarker = null;
       this.devirtualizer = null;
       this.typeChecker = null;
-      this.d8NestBasedAccessDesugaring = null;
       this.stringSwitchRemover = null;
       this.serviceLoaderRewriter = null;
       this.methodOptimizationInfoCollector = null;
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 04fb914..11e6e33 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
@@ -75,7 +75,7 @@
   }
 
   public boolean needsDesugaring(DexMethod method) {
-    return rewritableMethods.getProvider(method) != null;
+    return getMethodProviderOrNull(method) != null;
   }
 
   public static List<DexMethod> generateListOfBackportedMethods(
@@ -165,7 +165,30 @@
   private MethodProvider getMethodProviderOrNull(DexMethod method) {
     DexMethod original = appView.graphLens().getOriginalMethodSignature(method);
     assert original != null;
-    return rewritableMethods.getProvider(original);
+    MethodProvider provider = rewritableMethods.getProvider(original);
+    // TODO(b/150693139): Since the DesugarLibraryRetargeter is run during IR processing while the
+    // backported method rewriter is run in cf to cf, we need here to compute if the method is
+    // actually going to be retargeted through desugared library backports, and compute the
+    // corresponding backported method if so. This can be removed once the DesugarLibraryRetargeter
+    // has been moved as a cf to cf transformation.
+    if (provider == null
+        && appView.options().isDesugaredLibraryCompilation()
+        && appView
+            .options()
+            .desugaredLibraryConfiguration
+            .getBackportCoreLibraryMember()
+            .containsKey(method.holder)) {
+      DexType newHolder =
+          appView
+              .options()
+              .desugaredLibraryConfiguration
+              .getBackportCoreLibraryMember()
+              .get(method.holder);
+      DexMethod backportedMethod =
+          appView.dexItemFactory().createMethod(newHolder, method.proto, method.name);
+      provider = rewritableMethods.getProvider(backportedMethod);
+    }
+    return provider;
   }
 
   private static final class RewritableMethods {
@@ -175,15 +198,6 @@
 
     RewritableMethods(InternalOptions options, AppView<?> appView) {
 
-      if (options.testing.forceLibBackportsInL8CfToCf) {
-        DexItemFactory factory = options.itemFactory;
-        initializeJava9OptionalMethodProviders(factory);
-        initializeJava10OptionalMethodProviders(factory);
-        initializeJava11OptionalMethodProviders(factory);
-        initializeStreamMethodProviders(factory);
-        return;
-      }
-
       if (!options.shouldBackportMethods()) {
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
index bd468b0..787915f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
@@ -146,6 +146,9 @@
   public void desugarNestBasedAccess(
       DexApplication.Builder<?> builder, ExecutorService executorService, IRConverter converter)
       throws ExecutionException {
+    if (metNestHosts.isEmpty()) {
+      return;
+    }
     processNestsConcurrently(executorService);
     addDeferredBridges();
     synthesizeNestConstructor(builder);
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 8bc1a55..e19694e 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1293,7 +1293,6 @@
     public PrintStream whyAreYouNotInliningConsumer = System.out;
     public boolean trackDesugaredAPIConversions =
         System.getProperty("com.android.tools.r8.trackDesugaredAPIConversions") != null;
-    public boolean forceLibBackportsInL8CfToCf = false;
     public boolean enumUnboxingRewriteJavaCGeneratedMethod = false;
     // TODO(b/154793333): Enable assertions always when resolved.
     public boolean assertConsistentRenamingOfSignature = false;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
index a01a59a..9b48952 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -7,7 +7,6 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index e4b3869..b02b2e9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -119,7 +119,6 @@
           options -> {
             if (extraFiles) {
               options.testing.disableL8AnnotationRemoval = true;
-              options.testing.forceLibBackportsInL8CfToCf = true;
             }
             optionsModifier.accept(options);
           });