[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;
       }