[Retrace] Discard residual signature placed after first mapped range

Bug: b/283837159
Change-Id: I12fb9c25fa12e69be6f2b2f0e126289b61c2e62b
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 05681d8..50f9d4d 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -358,6 +358,7 @@
       if (isCommentLineWithJsonBrace()) {
         final String currentRenamedNameFinal = previousRenamedName;
         final MappedRange currentRange = activeMappedRange;
+        final MemberNaming lastAddedNamingFinal = lastAddedNaming;
         // Reading global info should cause member mapping to return since we are now reading
         // headers pertaining to what could be a concatinated file.
         BooleanBox readGlobalInfo = new BooleanBox(false);
@@ -414,8 +415,10 @@
                       currentResidualSignature.clear();
                       return;
                     }
-                    currentRange.setResidualSignatureInternal(
-                        residualSignature.asMethodSignature());
+                    if (!isMappedRangeLastAddedNaming(lastAddedNamingFinal, currentRange)) {
+                      currentRange.setResidualSignatureInternal(
+                          residualSignature.asMethodSignature());
+                    }
                   }
                 }
               }
@@ -477,10 +480,7 @@
         if (activeMappedRange != null) {
           if (residualSignature != null) {
             activeMappedRange.setResidualSignatureInternal(residualSignature);
-          } else if (lastAddedNaming != null
-              && lastAddedNaming
-                  .getOriginalSignature()
-                  .equals(activeMappedRange.getOriginalSignature())) {
+          } else if (isMappedRangeLastAddedNaming(lastAddedNaming, activeMappedRange)) {
             // If we already parsed a residual signature for the newly read mapped range and have
             // lost the information about the residual signature we re-create it again.
             activeMappedRange.setResidualSignatureInternal(
@@ -527,6 +527,12 @@
     }
   }
 
+  private boolean isMappedRangeLastAddedNaming(
+      MemberNaming lastAddedNaming, MappedRange activeMappedRange) {
+    return lastAddedNaming != null
+        && lastAddedNaming.getOriginalSignature().equals(activeMappedRange.getOriginalSignature());
+  }
+
   private MemberNaming addMemberEntryOrCopyInformation(
       MemberNaming lastAddedNaming,
       Signature originalSignature,
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index 2662956..3644aa8 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -438,11 +438,8 @@
   }
 
   @Test
-  public void testResidualSignatureOnOuterFrameStackTrace() {
-    // TODO(b/283837159): Disregard residual signatures placed incorrectly.
-    assumeFalse(external);
-    assertThrows(
-        AssertionError.class, () -> runRetraceTest(new ResidualSignatureOnOuterFrameStackTrace()));
+  public void testResidualSignatureOnOuterFrameStackTrace() throws Exception {
+    runRetraceTest(new ResidualSignatureOnOuterFrameStackTrace());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/ResidualSignatureOnOuterFrameStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/ResidualSignatureOnOuterFrameStackTrace.java
index b558c90..f464a62 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/ResidualSignatureOnOuterFrameStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/ResidualSignatureOnOuterFrameStackTrace.java
@@ -31,12 +31,13 @@
 
   @Override
   public List<String> retracedStackTrace() {
-    return Collections.singletonList("\tat mapping.g(SourceFile)");
+    return Collections.singletonList("\tat pruned.class.method(class.java)");
   }
 
   @Override
   public List<String> retraceVerboseStackTrace() {
-    return Collections.singletonList("\tat mapping.g(SourceFile)");
+    return Collections.singletonList(
+        "\tat pruned.class.void method(kotlinx.coroutines.CoroutineScope)(class.java)");
   }
 
   @Override