[Retrace] Put residual signature in for mapped ranges

Bug: b/241763080
Change-Id: I5f27aae27099594a1fd66ba3a14db60f0a89d4c0
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNaming.java b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
index 83b7b3f..d0d0b63 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
@@ -27,7 +27,7 @@
         Range obfuscatedRange,
         MemberNaming.MethodSignature originalSignature,
         Range originalRange,
-        String obfuscatedName);
+        MemberNaming.MethodSignature residualSignature);
 
     public abstract void addMappingInformation(
         MappingInformation info, Consumer<MappingInformation> onProhibitedAddition);
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
index 3c83c90..f4bdafa 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
@@ -89,7 +89,7 @@
         Range obfuscatedRange,
         MemberNaming.MethodSignature originalSignature,
         Range originalRange,
-        String obfuscatedName) {
+        MemberNaming.MethodSignature residualSignature) {
       return null;
     }
 
@@ -172,7 +172,7 @@
     //   {@link ClassNamingForNameMapper#lookupByOriginalSignature}.
     if (renamedSignature.kind() == SignatureKind.METHOD) {
       for (MemberNaming memberNaming : methodMembers.values()) {
-        if (memberNaming.getRenamedSignature().equals(renamedSignature)) {
+        if (memberNaming.getResidualSignature().equals(renamedSignature)) {
           return memberNaming;
         }
       }
@@ -180,7 +180,7 @@
     } else {
       assert renamedSignature.kind() == SignatureKind.FIELD;
       for (MemberNaming memberNaming : fieldMembers.values()) {
-        if (memberNaming.getRenamedSignature().equals(renamedSignature)) {
+        if (memberNaming.getResidualSignature().equals(renamedSignature)) {
           return memberNaming;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
index 050b1ff..31d05c3 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -60,11 +60,11 @@
     @Override
     public ClassNaming.Builder addMemberEntry(MemberNaming entry) {
       if (entry.isMethodNaming()) {
-        methodMembers.put(entry.getRenamedSignature().asMethodSignature(), entry);
+        methodMembers.put(entry.getResidualSignature().asMethodSignature(), entry);
       } else {
-        fieldMembers.put(entry.getRenamedSignature().asFieldSignature(), entry);
+        fieldMembers.put(entry.getResidualSignature().asFieldSignature(), entry);
         mappedFieldNamingsByName
-            .computeIfAbsent(entry.getRenamedName(), m -> new ArrayList<>())
+            .computeIfAbsent(entry.getRenamedName(), ignored -> new ArrayList<>())
             .add(entry);
       }
       return this;
@@ -99,10 +99,12 @@
         Range minifiedRange,
         MemberNaming.MethodSignature originalSignature,
         Range originalRange,
-        String renamedName) {
+        MemberNaming.MethodSignature residualSignature) {
       MappedRange range =
-          new MappedRange(minifiedRange, originalSignature, originalRange, renamedName);
-      mappedRangesByName.computeIfAbsent(renamedName, k -> new ArrayList<>()).add(range);
+          new MappedRange(minifiedRange, originalSignature, originalRange, residualSignature);
+      mappedRangesByName
+          .computeIfAbsent(residualSignature.getName(), ignored -> new ArrayList<>())
+          .add(range);
       return range;
     }
 
@@ -377,8 +379,8 @@
             mappedFields ->
                 mappedFields.forEach(
                     mappedField -> {
-                      if (mappedField.renamedSignature.isQualified()) {
-                        consumer.accept(mappedField.renamedSignature.toHolderFromQualified());
+                      if (mappedField.residualSignature.isQualified()) {
+                        consumer.accept(mappedField.residualSignature.toHolderFromQualified());
                       }
                     }));
     mappedRangesByRenamedName
@@ -494,7 +496,7 @@
     public final Range minifiedRange; // Can be null, if so then originalRange must also be null.
     public final MethodSignature signature;
     public final Range originalRange;
-    public final String renamedName;
+    private MethodSignature residualSignature;
 
     /**
      * The sole purpose of {@link #sequenceNumber} is to preserve the order of members read from a
@@ -505,11 +507,14 @@
     private List<MappingInformation> additionalMappingInfo = EMPTY_MAPPING_INFORMATION;
 
     MappedRange(
-        Range minifiedRange, MethodSignature signature, Range originalRange, String renamedName) {
+        Range minifiedRange,
+        MethodSignature signature,
+        Range originalRange,
+        MethodSignature residualSignature) {
       this.minifiedRange = minifiedRange;
       this.signature = signature;
       this.originalRange = originalRange;
-      this.renamedName = renamedName;
+      this.residualSignature = residualSignature;
     }
 
     public void addMappingInformation(
@@ -594,6 +599,14 @@
       }
     }
 
+    public MethodSignature getResidualSignature() {
+      return residualSignature;
+    }
+
+    public void setResidualSignatureInternal(MethodSignature residualSignature) {
+      this.residualSignature = residualSignature;
+    }
+
     @Override
     public String toString() {
       StringBuilder builder = new StringBuilder();
@@ -604,7 +617,7 @@
       if (originalRange != null && !originalRange.equals(minifiedRange)) {
         builder.append(":").append(originalRange);
       }
-      builder.append(" -> ").append(renamedName);
+      builder.append(" -> ").append(residualSignature.name);
       return builder.toString();
     }
 
@@ -624,7 +637,7 @@
       return Objects.equals(minifiedRange, that.minifiedRange)
           && Objects.equals(originalRange, that.originalRange)
           && signature.equals(that.signature)
-          && renamedName.equals(that.renamedName);
+          && residualSignature.equals(that.residualSignature);
     }
 
     @Override
@@ -633,7 +646,7 @@
       int result = Objects.hashCode(minifiedRange);
       result = 31 * result + Objects.hashCode(originalRange);
       result = 31 * result + signature.hashCode();
-      result = 31 * result + renamedName.hashCode();
+      result = 31 * result + residualSignature.hashCode();
       return result;
     }
 
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
index 3919bbb..c4aebb7 100644
--- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
+++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -447,11 +447,11 @@
             for (int i = 0; i < memberNamings.size(); i++) {
               MemberNaming memberNaming = memberNamings.get(i);
               assert memberNaming.getRenamedName().equals(fieldNaming.getOriginalName());
-              if (memberNaming.renamedSignature.equals(fieldNaming.getOriginalSignature())) {
+              if (memberNaming.residualSignature.equals(fieldNaming.getOriginalSignature())) {
                 memberNamings.set(
                     i,
                     new MemberNaming(
-                        memberNaming.getOriginalSignature(), fieldNaming.getRenamedName()));
+                        memberNaming.getOriginalSignature(), fieldNaming.getResidualSignature()));
                 return;
               }
             }
@@ -488,7 +488,9 @@
           Range minifiedRange = mappedRangeResult.lastRange.minifiedRange;
           int endMinifiedPosition = minifiedRange == null ? NO_RANGE_FROM : minifiedRange.to;
           methodMembers
-              .computeIfAbsent(newMappedRange.renamedName, ignored -> new SegmentTree<>(false))
+              .computeIfAbsent(
+                  newMappedRange.getResidualSignature().getName(),
+                  ignored -> new SegmentTree<>(false))
               .add(
                   mappedRangeResult.startMinifiedPosition,
                   endMinifiedPosition,
@@ -619,7 +621,7 @@
                     newRange.minifiedRange,
                     existingRange.signature,
                     existingRange.originalRange,
-                    newRange.renamedName));
+                    newRange.getResidualSignature()));
           }
         } else {
           // First check if the original range matches the existing minified range.
@@ -683,7 +685,7 @@
             .getUpdateOutlineCallsiteInformation(
                 currentOriginalName,
                 ListUtils.last(newRanges).signature.getName(),
-                lastComposedRange.renamedName)
+                lastComposedRange.getResidualSignature().getName())
             .setNewMappedRanges(newRanges);
         lastComposedRange.addMappingInformation(
             computedOutlineInformation.seenOutlineMappingInformation,
@@ -770,7 +772,7 @@
                 newMinifiedRange,
                 existingMappedRange.signature,
                 newOriginalRange,
-                newMappedRange.renamedName);
+                newMappedRange.getResidualSignature());
         existingMappedRange
             .getAdditionalMappingInfo()
             .forEach(
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNaming.java b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
index 3437cbb..f8e4d02 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
@@ -45,30 +45,30 @@
     }
 
     MemberNaming that = (MemberNaming) o;
-    return signature.equals(that.signature) && renamedSignature.equals(that.renamedSignature);
+    return signature.equals(that.signature) && residualSignature.equals(that.residualSignature);
   }
 
   @Override
   public int hashCode() {
     int result = signature.hashCode();
-    result = 31 * result + renamedSignature.hashCode();
+    result = 31 * result + residualSignature.hashCode();
     return result;
   }
 
   /** Original signature of the member. */
   final Signature signature;
-  /** Renamed signature where types and names could be changed. */
-  Signature renamedSignature;
+  /** Residual signature where types and names could be changed. */
+  Signature residualSignature;
   /** Position of the member in the file. */
   final Position position;
 
-  public MemberNaming(Signature signature, String renamedName) {
-    this(signature, signature.asRenamed(renamedName), Position.UNKNOWN);
+  public MemberNaming(Signature signature, Signature residualSignature) {
+    this(signature, residualSignature, Position.UNKNOWN);
   }
 
-  public MemberNaming(Signature signature, Signature renamedSignature, Position position) {
+  public MemberNaming(Signature signature, Signature residualSignature, Position position) {
     this.signature = signature;
-    this.renamedSignature = renamedSignature;
+    this.residualSignature = residualSignature;
     this.position = position;
   }
 
@@ -80,12 +80,12 @@
     return signature.name;
   }
 
-  public Signature getRenamedSignature() {
-    return renamedSignature;
+  public Signature getResidualSignature() {
+    return residualSignature;
   }
 
   public String getRenamedName() {
-    return renamedSignature.name;
+    return residualSignature.name;
   }
 
   public boolean isMethodNaming() {
@@ -102,11 +102,11 @@
 
   @Override
   public String toString() {
-    return signature.toString() + " -> " + renamedSignature.name;
+    return signature.toString() + " -> " + residualSignature.name;
   }
 
-  public void setRenamedSignatureInternal(Signature signature) {
-    this.renamedSignature = signature;
+  public void setResidualSignatureInternal(Signature signature) {
+    this.residualSignature = signature;
   }
 
   public abstract static class Signature {
@@ -335,7 +335,7 @@
     }
 
     @Override
-    Signature asRenamed(String renamedName) {
+    MethodSignature asRenamed(String renamedName) {
       return new MethodSignature(renamedName, type, parameters);
     }
 
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 5c6cccb..3c3c106 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -365,15 +365,18 @@
                             MappingInformationDiagnostics.notAllowedCombination(
                                 info, conflictingInfo, lineNo)));
                 if (info.isResidualMethodSignatureMappingInformation()) {
-                  ResidualMethodSignatureMappingInformation residualSignature =
+                  ResidualMethodSignatureMappingInformation residualSignatureInfo =
                       info.asResidualMethodSignatureMappingInformation();
-                  currentMember.setRenamedSignatureInternal(
+                  MethodSignature residualSignature =
                       new MethodSignature(
                           currentMember.getRenamedName(),
-                          DescriptorUtils.descriptorToJavaType(residualSignature.getReturnType()),
+                          DescriptorUtils.descriptorToJavaType(
+                              residualSignatureInfo.getReturnType()),
                           ArrayUtils.mapToStringArray(
-                              residualSignature.getParameters(),
-                              DescriptorUtils::descriptorToJavaType)));
+                              residualSignatureInfo.getParameters(),
+                              DescriptorUtils::descriptorToJavaType));
+                  currentMember.setResidualSignatureInternal(residualSignature);
+                  currentRange.setResidualSignatureInternal(residualSignature);
                 }
               }
             });
@@ -419,13 +422,21 @@
       skipWhitespace();
       String renamedName = parseMethodName();
 
-      if (signature instanceof MethodSignature) {
+      if (signature.isMethodSignature()) {
+        MethodSignature residualSignature;
+        if (activeMappedRange != null
+            && activeMappedRange.signature == signature
+            && activeMappedRange.getResidualSignature().getName().equals(renamedName)) {
+          residualSignature = activeMappedRange.getResidualSignature();
+        } else {
+          residualSignature = signature.asMethodSignature().asRenamed(renamedName);
+        }
         activeMappedRange =
             classNamingBuilder.addMappedRange(
-                mappedRange, (MethodSignature) signature, originalRange, renamedName);
+                mappedRange, signature.asMethodSignature(), originalRange, residualSignature);
       }
 
-      assert mappedRange == null || signature instanceof MethodSignature;
+      assert mappedRange == null || signature.isMethodSignature();
 
       // If this line refers to a member that should be added to classNamingBuilder (as opposed to
       // an inner inlined callee) and it's different from the the previous activeMemberNaming, then
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index d71f6b5..4885cb5 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -633,22 +633,21 @@
           MethodSignature originalSignature =
               MethodSignature.fromDexMethod(originalMethod, originalMethod.holder != originalType);
 
-          DexString obfuscatedNameDexString =
-              appView.getNamingLens().lookupName(method.getReference());
-          String obfuscatedName = obfuscatedNameDexString.toString();
-
           List<MappingInformation> methodMappingInfo = new ArrayList<>();
           if (definition.isD8R8Synthesized()) {
             methodMappingInfo.add(CompilerSynthesizedMappingInformation.builder().build());
           }
 
+          DexMethod residualMethod =
+              appView.getNamingLens().lookupMethod(method.getReference(), appView.dexItemFactory());
+
           MapVersion mapFileVersion = appView.options().getMapFileVersion();
           if (isIdentityMapping(
               mapFileVersion,
               mappedPositions,
               methodMappingInfo,
               method,
-              obfuscatedNameDexString,
+              residualMethod.getName(),
               originalMethod,
               originalType)) {
             assert appView.options().lineNumberOptimization == LineNumberOptimization.OFF
@@ -660,10 +659,12 @@
           if (mapFileVersion.isGreaterThan(MapVersion.MAP_VERSION_2_1)
               && originalMethod != method.getReference()) {
             methodMappingInfo.add(
-                ResidualMethodSignatureMappingInformation.fromDexMethod(method.getReference()));
+                ResidualMethodSignatureMappingInformation.fromDexMethod(residualMethod));
           }
 
-          MemberNaming memberNaming = new MemberNaming(originalSignature, obfuscatedName);
+          MethodSignature residualSignature = MethodSignature.fromDexMethod(residualMethod);
+
+          MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
           onDemandClassNamingBuilder.computeIfAbsent().addMemberEntry(memberNaming);
 
           // Add simple "a() -> b" mapping if we won't have any other with concrete line numbers
@@ -671,7 +672,7 @@
             MappedRange range =
                 onDemandClassNamingBuilder
                     .computeIfAbsent()
-                    .addMappedRange(null, originalSignature, null, obfuscatedName);
+                    .addMappedRange(null, originalSignature, null, residualSignature);
             methodMappingInfo.forEach(
                 info -> range.addMappingInformation(info, Unreachable::raise));
             continue;
@@ -745,7 +746,7 @@
                     getOriginalMethodSignature,
                     classNamingBuilder,
                     firstPosition.method,
-                    obfuscatedName,
+                    residualSignature,
                     obfuscatedRange,
                     nonCardinalRangeCache.get(
                         firstPosition.originalLine, lastPosition.originalLine),
@@ -774,7 +775,7 @@
                         getOriginalMethodSignature,
                         classNamingBuilder,
                         position.getMethod(),
-                        obfuscatedName,
+                        residualSignature,
                         nonCardinalRangeCache.get(
                             placeHolderLineToBeFixed, placeHolderLineToBeFixed),
                         nonCardinalRangeCache.get(position.getLine(), position.getLine()),
@@ -884,7 +885,7 @@
       Function<DexMethod, MethodSignature> getOriginalMethodSignature,
       Builder classNamingBuilder,
       DexMethod method,
-      String obfuscatedName,
+      MethodSignature residualSignature,
       Range obfuscatedRange,
       Range originalLine,
       Position caller,
@@ -895,7 +896,7 @@
             obfuscatedRange,
             getOriginalMethodSignature.apply(method),
             originalLine,
-            obfuscatedName);
+            residualSignature);
     int inlineFramesCount = 0;
     while (caller != null) {
       inlineFramesCount += 1;
@@ -912,7 +913,7 @@
               getOriginalMethodSignature.apply(caller.getMethod()),
               cardinalRangeCache.get(
                   Math.max(caller.getLine(), 0)), // Prevent against "no-position".
-              obfuscatedName);
+              residualSignature);
       if (caller.isRemoveInnerFramesIfThrowingNpe()) {
         lastMappedRange.addMappingInformation(
             RewriteFrameMappingInformation.builder()
@@ -1025,11 +1026,13 @@
         dexEncodedField -> {
           DexField dexField = dexEncodedField.getReference();
           DexField originalField = appView.graphLens().getOriginalFieldSignature(dexField);
-          DexString renamedName = appView.getNamingLens().lookupName(dexField);
-          if (renamedName != originalField.name || originalField.holder != originalType) {
+          DexField residualField =
+              appView.getNamingLens().lookupField(dexField, appView.dexItemFactory());
+          if (residualField.name != originalField.name || originalField.holder != originalType) {
             FieldSignature originalSignature =
                 FieldSignature.fromDexField(originalField, originalField.holder != originalType);
-            MemberNaming memberNaming = new MemberNaming(originalSignature, renamedName.toString());
+            MemberNaming memberNaming =
+                new MemberNaming(originalSignature, FieldSignature.fromDexField(residualField));
             onDemandClassNamingBuilder.computeIfAbsent().addMemberEntry(memberNaming);
           }
         });
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 0ecf5e3..2a4799c 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -61,7 +61,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 // TODO(christofferqa): Add tests to check that statically typed invocations on method handles
-// continue to work after class merging.
+//  continue to work after class merging.
 @RunWith(Parameterized.class)
 public class VerticalClassMergerTest extends TestBase {
 
@@ -539,7 +539,7 @@
                             .toString()
                             .equals("java.lang.String classmerging.ProguardFieldMapTest$A.f")
                         && fieldNaming
-                            .getRenamedSignature()
+                            .getResidualSignature()
                             .toString()
                             .equals("java.lang.String f")));
   }
@@ -587,7 +587,7 @@
                     methodNaming
                         .getOriginalSignature()
                         .toString()
-                        .equals(methodNaming.getRenamedSignature().toString())));
+                        .equals(methodNaming.getResidualSignature().toString())));
 
     // Try with vertical class merging.
     Set<String> preservedClassNames =
@@ -620,7 +620,7 @@
                             .toString()
                             .equals("void classmerging.ProguardMethodMapTest$A.method()")
                         && methodNaming
-                            .getRenamedSignature()
+                            .getResidualSignature()
                             .toString()
                             .equals("void method$classmerging$ProguardMethodMapTest$A()")));
   }
@@ -677,7 +677,7 @@
                             .signature
                             .toString()
                             .equals("void classmerging.ProguardMethodMapTest$A.method()")
-                        && mappedRange.renamedName.equals("method")));
+                        && mappedRange.getResidualSignature().getName().equals("method")));
 
     // Try with vertical class merging.
     Set<String> preservedClassNames =
@@ -717,7 +717,7 @@
                             .signature
                             .toString()
                             .equals("void classmerging.ProguardMethodMapTest$A.method()")
-                        && mappedRange.renamedName.equals("method")));
+                        && mappedRange.getResidualSignature().getName().equals("method")));
   }
 
   @Test