Avoid long synthetic direct method names in class merger

Change-Id: I1f532c028e4d6c26b75d5759e8314556bfcc2481
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index e4be854..7d95e87 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -2136,7 +2136,31 @@
    *
    * @param holder indicates where the method originates from.
    */
-  public DexMethod createFreshMethodName(
+  public DexMethod createFreshMethodNameWithHolder(
+      String baseName,
+      DexType holder,
+      DexProto proto,
+      DexType target,
+      Predicate<DexMethod> isFresh) {
+    assert holder != null;
+    return internalCreateFreshMethodNameWithHolder(baseName, holder, proto, target, isFresh);
+  }
+
+  /**
+   * Tries to find a method name for insertion into the class {@code target} of the form baseName$n,
+   * where {@code baseName} is supplied by the user, and {@code n} is picked to be the first number
+   * so that {@code isFresh.apply(method)} returns {@code true}.
+   */
+  public DexMethod createFreshMethodNameWithoutHolder(
+      String baseName, DexProto proto, DexType target, Predicate<DexMethod> isFresh) {
+    return internalCreateFreshMethodNameWithHolder(baseName, null, proto, target, isFresh);
+  }
+
+  /**
+   * Used to find a fresh method name of the from {@code baseName$n}, or {@code baseName$holder$n}
+   * if {@param holder} is non-null.
+   */
+  private DexMethod internalCreateFreshMethodNameWithHolder(
       String baseName,
       DexType holder,
       DexProto proto,
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
index 23b27f3..36eca4b 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ClassMerger.java
@@ -167,10 +167,9 @@
    */
   DexMethod renameDirectMethod(ProgramMethod method) {
     assert method.getDefinition().belongsToDirectPool();
-    return dexItemFactory.createFreshMethodName(
-        method.getDefinition().getReference().name.toSourceString(),
-        method.getHolderType(),
-        method.getDefinition().getProto(),
+    return dexItemFactory.createFreshMethodNameWithoutHolder(
+        method.getName().toSourceString(),
+        method.getProto(),
         group.getTarget().getType(),
         classMethodsBuilder::isFresh);
   }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorMerger.java
index 25066e7..3d37050 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/ConstructorMerger.java
@@ -109,7 +109,7 @@
   private DexMethod moveConstructor(
       ClassMethodsBuilder classMethodsBuilder, DexEncodedMethod constructor) {
     DexMethod method =
-        dexItemFactory.createFreshMethodName(
+        dexItemFactory.createFreshMethodNameWithHolder(
             TEMPORARY_INSTANCE_INITIALIZER_PREFIX,
             constructor.getHolderType(),
             constructor.getProto(),
@@ -173,9 +173,8 @@
     // unintended side-effects such as leading to unused argument removal being applied to the
     // synthesized constructor all-though it by construction doesn't have any unused arguments.
     DexMethod bridgeConstructorReference =
-        dexItemFactory.createFreshMethodName(
+        dexItemFactory.createFreshMethodNameWithoutHolder(
             "$r8$init$bridge",
-            null,
             originalConstructorReference.getProto(),
             originalConstructorReference.getHolderType(),
             classMethodsBuilder::isFresh);
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
index d475710..53ca8c8 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/TreeFixer.java
@@ -254,9 +254,8 @@
             Collections.nCopies(extraNulls, new ExtraUnusedNullParameter()));
       } else {
         newMethodReference =
-            dexItemFactory.createFreshMethodName(
+            dexItemFactory.createFreshMethodNameWithoutHolder(
                 newMethodReference.getName().toSourceString(),
-                null,
                 newMethodReference.proto,
                 newMethodReference.holder,
                 tryMethod ->
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
index 4992877..66d466d 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/VirtualMethodMerger.java
@@ -101,7 +101,7 @@
   private DexMethod moveMethod(ClassMethodsBuilder classMethodsBuilder, ProgramMethod oldMethod) {
     DexMethod oldMethodReference = oldMethod.getReference();
     DexMethod method =
-        dexItemFactory.createFreshMethodName(
+        dexItemFactory.createFreshMethodNameWithHolder(
             oldMethodReference.name.toSourceString(),
             oldMethod.getHolderType(),
             oldMethodReference.proto,
@@ -261,9 +261,8 @@
     DexMethod originalMethodReference =
         appView.graphLens().getOriginalMethodSignature(representative.getReference());
     DexMethod bridgeMethodReference =
-        dexItemFactory.createFreshMethodName(
+        dexItemFactory.createFreshMethodNameWithoutHolder(
             originalMethodReference.getName().toSourceString() + "$bridge",
-            null,
             originalMethodReference.proto,
             originalMethodReference.getHolderType(),
             classMethodsBuilder::isFresh);