Do not minify library overrides

even if it's library or program override

Bug: b/242948951
Change-Id: Ib52621517967512631459a81a840594d0e3bdb35
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fcf37fb..6a9fb76 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -201,6 +201,11 @@
     }
 
     @Override
+    public void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass) {
+      // Intentionally empty.
+    }
+
+    @Override
     public void acceptAPIConversion(ProgramMethod method) {
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
@@ -378,6 +383,11 @@
     }
 
     @Override
+    public void acceptGenericApiConversionStub(DexClasspathClass clazz) {
+      additions.addLiveClasspathClass(clazz);
+    }
+
+    @Override
     public void acceptAPIConversion(ProgramMethod method) {
       // Intentionally empty. The method will be hit by tracing if required.
     }
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 e67d55a..f96680f 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
@@ -123,6 +123,11 @@
     public void acceptEnumConversionClasspathClass(DexClasspathClass clazz) {
       // Intentionally empty.
     }
+
+    @Override
+    public void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass) {
+      // Intentionally empty.
+    }
   }
 
   public static class R8PostProcessingDesugaringEventConsumer
@@ -199,5 +204,10 @@
     public void acceptEnumConversionClasspathClass(DexClasspathClass clazz) {
       additions.addLiveClasspathClass(clazz);
     }
+
+    @Override
+    public void acceptGenericApiConversionStub(DexClasspathClass clazz) {
+      additions.addLiveClasspathClass(clazz);
+    }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index b316972..178255b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
+import com.android.tools.r8.graph.ClasspathMethod;
 import com.android.tools.r8.graph.ClasspathOrLibraryClass;
 import com.android.tools.r8.graph.Code;
 import com.android.tools.r8.graph.DexClass;
@@ -167,6 +168,28 @@
     return false;
   }
 
+  private DexMethod ensureApiGenericConversion(
+      DexMethod conversion, DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+    assert !appView.options().isDesugaredLibraryCompilation();
+    ClasspathMethod classpathMethod =
+        appView
+            .getSyntheticItems()
+            .ensureFixedClasspathMethodFromType(
+                conversion.getName(),
+                conversion.getProto(),
+                kinds -> kinds.GENERIC_API_CONVERSION_STUB,
+                conversion.getHolderType(),
+                appView,
+                ignored -> {},
+                eventConsumer::acceptGenericApiConversionStub,
+                methodBuilder ->
+                    methodBuilder
+                        .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
+                        .setCode(null));
+    assert classpathMethod.getReference() == conversion;
+    return conversion;
+  }
+
   public DexMethod ensureConversionMethod(
       DexType type,
       boolean destIsVivified,
@@ -175,7 +198,7 @@
       Supplier<UniqueContext> contextSupplier) {
     if (apiGenericTypesConversion != null) {
       assert !type.isArrayType();
-      return apiGenericTypesConversion;
+      return ensureApiGenericConversion(apiGenericTypesConversion, eventConsumer);
     }
     DexType srcType = destIsVivified ? type : vivifiedTypeFor(type);
     DexType destType = destIsVivified ? vivifiedTypeFor(type) : type;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
index 6d91ba2..4adc11f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
@@ -26,6 +26,8 @@
     void acceptWrapperClasspathClass(DexClasspathClass clazz);
 
     void acceptEnumConversionClasspathClass(DexClasspathClass clazz);
+
+    void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass);
   }
 
   interface DesugaredLibraryAPIConverterEventConsumer
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 bb56ca2..90b9dfb 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2974,12 +2974,18 @@
     worklist.addIfNotSeen(instantiatedClass);
     while (worklist.hasNext()) {
       DexProgramClass clazz = worklist.next();
-      DexEncodedMethod override = clazz.lookupVirtualMethod(libraryMethodOverride);
+      ProgramMethod override = clazz.lookupProgramMethod(libraryMethodOverride);
       if (override != null) {
-        if (override.isLibraryMethodOverride().isTrue()) {
+        if (override.getDefinition().isLibraryMethodOverride().isTrue()) {
           continue;
         }
-        override.setLibraryMethodOverride(OptionalBool.TRUE);
+        override.getDefinition().setLibraryMethodOverride(OptionalBool.TRUE);
+        // TODO(b/243483849): The minifier does not detect library overrides if the library class
+        //  is present both as program and library class. We force disable minification here as a
+        //  work-around until this is fixed.
+        if (options.loadAllClassDefinitions) {
+          shouldNotBeMinified(override);
+        }
       }
       clazz.forEachImmediateSupertype(
           superType -> {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 9aed303..2de90be 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -29,6 +29,7 @@
   public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
 
   // Classpath only synthetics in the global type namespace.
+  public final SyntheticKind GENERIC_API_CONVERSION_STUB = generator.forGlobalClasspathClass();
   public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass();
   public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
index 8a0cd60..920798f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
-import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -40,14 +39,17 @@
       Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stackwalker.jar");
   private static final String EXPECTED_OUTPUT =
       StringUtils.lines("[main]", "[frame2, frame1, main]");
-  private static final String EXPECTED_OUTPUT_R8_MINIMAL = StringUtils.lines("[main]", "[main]");
-  private static final String EXPECTED_OUTPUT_R8 = StringUtils.lines("[main]", "[a, main]");
+  private static final String EXPECTED_OUTPUT_R8 = StringUtils.lines("[main]", "[main]");
   private static final String MAIN_CLASS = "stackwalker.Example";
 
   @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters().withDexRuntime(Version.MASTER).withAllApiLevels().build(),
+        getTestParameters()
+            .withDexRuntime(Version.MASTER)
+            .withApiLevel(AndroidApiLevel.B)
+            .withApiLevel(AndroidApiLevel.T)
+            .build(),
         ImmutableList.of(JDK11_MINIMAL, JDK11, JDK11_PATH),
         DEFAULT_SPECIFICATIONS);
   }
@@ -79,22 +81,11 @@
     testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
         .addProgramFiles(INPUT_JAR)
         .addKeepMainRule(MAIN_CLASS)
-        // TODO(b/242948951): Should not need dontobfuscate.
-        .applyIf(compilationSpecification.isL8Shrink(), b -> b.addL8KeepRules("-dontobfuscate"))
         .overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.MASTER))
         // Missing class java.lang.StackWalker$StackFrame.
         .addOptionsModification(opt -> opt.ignoreMissingClasses = true)
-        .applyIf(
-            libraryDesugaringSpecification != JDK11_MINIMAL
-                || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER),
-            DesugaredLibraryTestBuilder::allowDiagnosticWarningMessages)
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutput(
-            compilationSpecification.isProgramShrink()
-                ? ((libraryDesugaringSpecification == JDK11_MINIMAL
-                        || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER))
-                    ? EXPECTED_OUTPUT_R8_MINIMAL
-                    : EXPECTED_OUTPUT_R8)
-                : EXPECTED_OUTPUT);
+            compilationSpecification.isProgramShrink() ? EXPECTED_OUTPUT_R8 : EXPECTED_OUTPUT);
   }
 }