Always desugar invokevirtual to private method on self for class files

Desugaring to class file should produce Java 7 compatible byte code, so
the invokevirtual to private on self should always be desugared in that
case.

When generating DEX the rewriting happens in the DEX writer, so no need
to desugar.

Bug: b/247759997
Change-Id: Ia12d3eaf35395194e4962ea015d5ef93b02558e6
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 7905c6c..a42d6e5 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
@@ -119,7 +119,9 @@
     desugarings.add(new LambdaInstructionDesugaring(appView));
     desugarings.add(new ConstantDynamicInstructionDesugaring(appView));
     desugarings.add(new InvokeSpecialToSelfDesugaring(appView));
-    if (appView.options().rewriteInvokeToPrivateInDesugar) {
+    if (appView.options().isGeneratingClassFiles()) {
+      // Nest desugaring has to be enabled to avoid other invokevirtual to private methods.
+      assert nestBasedAccessDesugaring != null;
       desugarings.add(new InvokeToPrivateRewriter());
     }
     desugarings.add(new StringConcatInstructionDesugaring(appView));
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 16ec417..f07a328 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -423,11 +423,6 @@
   public boolean createSingletonsForStatelessLambdas =
       System.getProperty("com.android.tools.r8.createSingletonsForStatelessLambdas") != null;
 
-  // Flag to control the representation of stateless lambdas.
-  // See b/222081665 for context.
-  public boolean rewriteInvokeToPrivateInDesugar =
-      System.getProperty("com.android.tools.r8.rewriteInvokeToPrivateInDesugar") != null;
-
   // Flag to allow record annotations in DEX. See b/231930852 for context.
   public boolean emitRecordAnnotationsInDex =
       System.getProperty("com.android.tools.r8.emitRecordAnnotationsInDex") != null;
diff --git a/src/test/java/com/android/tools/r8/desugar/InterfaceInvokePrivateTest.java b/src/test/java/com/android/tools/r8/desugar/InterfaceInvokePrivateTest.java
index 4055ea0..3ba706d 100644
--- a/src/test/java/com/android/tools/r8/desugar/InterfaceInvokePrivateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/InterfaceInvokePrivateTest.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.cf.CfVersion;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.IOException;
 import org.junit.Test;
@@ -30,16 +29,11 @@
   @Parameter(1)
   public CfVersion inputCfVersion;
 
-  @Parameter(2)
-  public boolean rewriteInvokeToPrivateInDesugar;
-
-  @Parameterized.Parameters(
-      name = "{0}, Input CfVersion = {1}, rewriteInvokeToPrivateInDesugar = {2}")
+  @Parameterized.Parameters(name = "{0}, Input CfVersion = {1})")
   public static Iterable<?> data() {
     return buildParameters(
         getTestParameters().withCfRuntimes().withDexRuntimes().withAllApiLevelsAlsoForCf().build(),
-        CfVersion.rangeInclusive(CfVersion.V1_8, CfVersion.V15),
-        BooleanUtils.values());
+        CfVersion.rangeInclusive(CfVersion.V1_8, CfVersion.V15));
   }
 
   private static final String EXPECTED_OUTPUT = StringUtils.unixLines("Hello, world!", "21", "6");
@@ -53,7 +47,6 @@
   public void testReference() throws Exception {
     assumeTrue(parameters.getRuntime().isCf());
     assumeTrue(parameters.getApiLevel().isEqualTo(AndroidApiLevel.B));
-    assumeTrue(rewriteInvokeToPrivateInDesugar);
 
     testForJvm()
         .addProgramClassFileData(transformIToPrivate(inputCfVersion))
@@ -76,9 +69,7 @@
 
   @Test
   public void testDesugar() throws Exception {
-    testForDesugaring(
-            parameters,
-            options -> options.rewriteInvokeToPrivateInDesugar = rewriteInvokeToPrivateInDesugar)
+    testForDesugaring(parameters)
         .addProgramClassFileData(transformIToPrivate(inputCfVersion))
         .addProgramClasses(TestRunner.class)
         .run(parameters.getRuntime(), TestRunner.class)
@@ -101,7 +92,7 @@
                     && parameters.getRuntime().asCf().isOlderThan(CfVm.JDK11)
                     && (DesugarTestConfiguration.isNotDesugared(c)
                         || (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)
-                            && !rewriteInvokeToPrivateInDesugar)),
+                            && c == DesugarTestConfiguration.D8_DEX)),
             r -> r.assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class),
             // All other conditions succeed.
             r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));