[Retrace] Emit residual signature if we run with experimental version
Bug: b/241763080
Change-Id: Ia08343a6d67db1dbfcb87f4b24ada4d64b971fe9
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLens.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java
index 188211d..46d91ef 100644
--- a/src/main/java/com/android/tools/r8/graph/GraphLens.java
+++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -386,6 +386,26 @@
return false;
}
+ // Predicate to see if a method definition is only changed by repackaging or synthetic
+ // finalization indicating that it is a simple renaming.
+ public final boolean isSimpleRenaming(DexMethod method) {
+ DexMethod methodToCompareAgainst = method;
+ DexMethod original = method;
+ GraphLens current = this;
+ while (current.isNonIdentityLens()) {
+ NonIdentityGraphLens nonIdentityLens = current.asNonIdentityLens();
+ original = nonIdentityLens.getPreviousMethodSignature(original);
+ if (current.isSimpleRenamingLens()) {
+ methodToCompareAgainst = original;
+ } else if (methodToCompareAgainst != original) {
+ return false;
+ }
+ assert nonIdentityLens.getPrevious() != null;
+ current = nonIdentityLens.getPrevious();
+ }
+ return true;
+ }
+
public abstract String lookupPackageName(String pkg);
public DexType lookupClassType(DexType type) {
@@ -572,6 +592,10 @@
return false;
}
+ public boolean isSimpleRenamingLens() {
+ return false;
+ }
+
public abstract boolean isIdentityLens();
public boolean isMemberRebindingLens() {
diff --git a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
index 64fe0eb..8b4ad76 100644
--- a/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
+++ b/src/main/java/com/android/tools/r8/repackaging/RepackagingLens.java
@@ -66,6 +66,11 @@
this::isSimpleTypeRenamingOrEqual);
}
+ @Override
+ public boolean isSimpleRenamingLens() {
+ return true;
+ }
+
private boolean isSimpleTypeRenamingOrEqual(DexType from, DexType to) {
return from == to || newTypes.get(from) == to;
}
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 0d767c6..54ef01b 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -101,6 +101,11 @@
public boolean isSyntheticFinalizationGraphLens() {
return true;
}
+
+ @Override
+ public boolean isSimpleRenamingLens() {
+ return true;
+ }
}
private static class Builder {
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index 1d53540..5603770 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -219,13 +219,12 @@
|| appView.isCfByteCodePassThrough(definition);
return this;
}
- // TODO(b/169953605): Ensure we emit the residual signature information.
if (mapFileVersion.isGreaterThan(MapVersion.MAP_VERSION_2_1)
- && originalMethod != method.getReference()) {
+ && originalMethod != method.getReference()
+ && !appView.graphLens().isSimpleRenaming(residualMethod)) {
methodMappingInfo.add(
ResidualMethodSignatureMappingInformation.fromDexMethod(residualMethod));
}
-
MethodSignature residualSignature = MethodSignature.fromDexMethod(residualMethod);
MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
@@ -234,9 +233,7 @@
// Add simple "a() -> b" mapping if we won't have any other with concrete line numbers
if (mappedPositions.isEmpty()) {
MappedRange range =
- getBuilder()
- .addMappedRange(
- null, originalSignature, null, residualSignature.getName().toString());
+ getBuilder().addMappedRange(null, originalSignature, null, residualSignature.getName());
methodMappingInfo.forEach(info -> range.addMappingInformation(info, Unreachable::raise));
return this;
}