Naming strategy in L8

- j$ types are minified normally, but package is preserved.
- java types have their package preserved, and are either kept (types
  and fixed suffix synthetic such as companion class) or minified with
  a non colliding naming scheme "j$a", "j$b", etc.

Bug: 222647019
Change-Id: Id050dde8ba9820f296c69e8cbc5ecd0c4cf790d4
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 0fafbac..7367257 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -200,6 +200,10 @@
     return topLevelFlags.getRequiredCompilationAPILevel();
   }
 
+  public boolean requiresTypeRewriting() {
+    return !getRewriteType().isEmpty() || !getRewriteDerivedTypeOnly().isEmpty();
+  }
+
   private int getLeadingVersionNumber() {
     if (leadingVersionNumberCache != -1) {
       return leadingVersionNumberCache;
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 1ba7556..2177ea3 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -53,7 +53,9 @@
     ClassNameMinifier classNameMinifier =
         new ClassNameMinifier(
             appView,
-            new MinificationClassNamingStrategy(appView),
+            appView.options().synthesizedClassPrefix.isEmpty()
+                ? new MinificationClassNamingStrategy(appView)
+                : new L8MinificationClassNamingStrategy(appView),
             // Use deterministic class order to make sure renaming is deterministic.
             appView.appInfo().classesWithDeterministicOrder());
     ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing);
@@ -122,6 +124,11 @@
     String nextName(char[] packagePrefix, InternalNamingState state) {
       StringBuilder nextName = new StringBuilder();
       nextName.append(packagePrefix);
+      nextName.append(nextString(packagePrefix, state));
+      return nextName.toString();
+    }
+
+    String nextString(char[] packagePrefix, InternalNamingState state) {
       String nextString;
       do {
         if (state.getDictionaryIndex() < obfuscationDictionary.size()) {
@@ -133,8 +140,36 @@
           } while (obfuscationDictionaryForLookup.contains(nextString));
         }
       } while (RESERVED_NAMES.contains(nextString));
-      nextName.append(nextString);
-      return nextName.toString();
+      return nextString;
+    }
+  }
+
+  static class L8MinificationClassNamingStrategy extends MinificationClassNamingStrategy {
+
+    private final String prefix;
+
+    L8MinificationClassNamingStrategy(AppView<AppInfoWithLiveness> appView) {
+      super(appView);
+      String synthesizedClassPrefix = appView.options().synthesizedClassPrefix;
+      prefix = synthesizedClassPrefix.substring(0, synthesizedClassPrefix.length() - 1);
+    }
+
+    private boolean startsWithPrefix(char[] packagePrefix) {
+      if (packagePrefix.length < prefix.length() + 1) {
+        return false;
+      }
+      for (int i = 0; i < prefix.length(); i++) {
+        if (prefix.charAt(i) != packagePrefix[i + 1]) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    @Override
+    String nextString(char[] packagePrefix, InternalNamingState state) {
+      String nextString = super.nextString(packagePrefix, state);
+      return startsWithPrefix(packagePrefix) ? nextString : prefix + nextString;
     }
   }
 
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 309e92a5..4360d10 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -969,9 +969,9 @@
       MachineDesugaredLibrarySpecification.empty();
 
   public TypeRewriter getTypeRewriter() {
-    return machineDesugaredLibrarySpecification.getRewriteType().isEmpty()
-        ? TypeRewriter.empty()
-        : new MachineDesugarPrefixRewritingMapper(machineDesugaredLibrarySpecification);
+    return machineDesugaredLibrarySpecification.requiresTypeRewriting()
+        ? new MachineDesugarPrefixRewritingMapper(machineDesugaredLibrarySpecification)
+        : TypeRewriter.empty();
   }
 
   public boolean relocatorCompilation = false;