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);