Desugared lib minification and vivified types

- fix typos in names in desugaredLibUtilitySuffix.
- fix wrappers to be outside of packages.
- fix minifier not to minify kept API with vivified types.

Change-Id: Iedd17801695ead6b2522ab1ac221eafd3e09ad64
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 f6f34e6..be6ffb2 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
@@ -1304,15 +1304,15 @@
       DexItemFactory factory = appView.dexItemFactory();
       String unqualifiedName = method.holder.getName();
       // Avoid duplicate class names between core lib dex file and program dex files.
-      String coreLibUtilitySuffix =
-          appView.options().isDesugaredLibraryCompilation() ? "$corelib" : "";
+      String desugaredLibUtilitySuffix =
+          appView.options().isDesugaredLibraryCompilation() ? "$desugaredLib" : "";
       String descriptor =
           UTILITY_CLASS_DESCRIPTOR_PREFIX
               + '$'
               + unqualifiedName
               + '$'
               + method.proto.parameters.size()
-              + coreLibUtilitySuffix
+              + desugaredLibUtilitySuffix
               + '$'
               + methodName
               + ';';
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
index 9c29f64..a8240ce 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryWrapperSynthesizer.java
@@ -94,6 +94,7 @@
 //   }
 public class DesugaredLibraryWrapperSynthesizer {
 
+  public static final String WRAPPER_PREFIX = "$r8$wrapper$";
   public static final String TYPE_WRAPPER_SUFFIX = "$-WRP";
   public static final String VIVIFIED_TYPE_WRAPPER_SUFFIX = "$-V-WRP";
 
@@ -145,6 +146,12 @@
         this::generateVivifiedTypeWrapper);
   }
 
+  private DexType createWrapperType(DexType type, String suffix) {
+    return factory.createType(
+        DescriptorUtils.javaTypeToDescriptor(
+            WRAPPER_PREFIX + type.toString().replace('.', '$') + suffix));
+  }
+
   private DexType getWrapper(
       DexType type,
       String suffix,
@@ -162,9 +169,7 @@
             type,
             t -> {
               toGenerate.set(true);
-              DexType wrapperType =
-                  factory.createType(
-                      DescriptorUtils.javaTypeToDescriptor(type.toString() + suffix));
+              DexType wrapperType = createWrapperType(type, suffix);
               generatedWrappers.add(wrapperType);
               return new Pair<>(wrapperType, null);
             });
diff --git a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
index d8fc1c6..7af0752 100644
--- a/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/MethodNameMinifier.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.Timing;
@@ -286,6 +287,14 @@
         DexString reservedName = strategy.getReservedName(method, holder);
         if (reservedName != null) {
           state.reserveName(reservedName, method.method);
+          // This is reserving names which after prefix rewriting will actually override a library
+          // method.
+          if (appView.rewritePrefix.hasRewrittenTypeInSignature(method.method.proto)) {
+            state.reserveName(
+                reservedName,
+                DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
+                    method.method, method.method.holder, appView));
+          }
         }
       }
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java b/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
index f7b0a1e..49ee9af 100644
--- a/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/conversionTests/CallBackConversionTest.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import java.nio.file.Path;
 import java.util.List;
@@ -74,23 +75,7 @@
         .addLibraryClasses(CustomLibClass.class)
         .enableCoreLibraryDesugaring(AndroidApiLevel.B)
         .compile()
-        .inspect(
-            i -> {
-              // The j$ method can be optimized, but the java method should be present to be called
-              // through the library.
-              List<FoundMethodSubject> virtualMethods = i.clazz(Impl.class).virtualMethods();
-              assertTrue(
-                  virtualMethods.stream()
-                      .anyMatch(
-                          m ->
-                              m.getMethod()
-                                  .method
-                                  .proto
-                                  .parameters
-                                  .values[0]
-                                  .toString()
-                                  .equals("java.util.function.Consumer")));
-            })
+        .inspect(this::assertLibraryOverridesThere)
         .addDesugaredCoreLibraryRunClassPath(
             this::buildDesugaredLibraryWithConversionExtension, AndroidApiLevel.B)
         .addRunClasspathFiles(customLib)
@@ -98,6 +83,42 @@
         .assertSuccessWithOutput(StringUtils.lines("0", "1", "0", "1"));
   }
 
+  @Test
+  public void testCallBackR8Minifying() throws Exception {
+    Path customLib = testForD8().addProgramClasses(CustomLibClass.class).compile().writeToZip();
+    testForR8(Backend.DEX)
+        .addKeepMainRule(Impl.class)
+        .setMinApi(AndroidApiLevel.B)
+        .addProgramClasses(Impl.class)
+        .addLibraryClasses(CustomLibClass.class)
+        .enableCoreLibraryDesugaring(AndroidApiLevel.B)
+        .compile()
+        .inspect(this::assertLibraryOverridesThere)
+        .addDesugaredCoreLibraryRunClassPath(
+            this::buildDesugaredLibraryWithConversionExtension, AndroidApiLevel.B)
+        .addRunClasspathFiles(customLib)
+        .run(new DexRuntime(DexVm.ART_9_0_0_HOST), Impl.class)
+        .assertSuccessWithOutput(StringUtils.lines("0", "1", "0", "1"));
+  }
+
+  private void assertLibraryOverridesThere(CodeInspector i) {
+    // The j$ method can be optimized, but the java method should be present to be called
+    // through the library.
+    List<FoundMethodSubject> virtualMethods = i.clazz(Impl.class).virtualMethods();
+    assertTrue(
+        virtualMethods.stream()
+            .anyMatch(
+                m ->
+                    m.getMethod().method.name.toString().equals("foo")
+                        && m.getMethod()
+                            .method
+                            .proto
+                            .parameters
+                            .values[0]
+                            .toString()
+                            .equals("java.util.function.Consumer")));
+  }
+
   static class Impl extends CustomLibClass {
 
     public int foo(Consumer<Object> o) {