Retrace: Let source-file take precedence if present

Bug: 132850880
Change-Id: Ic9939f46b3ceb111a095ec95efac95ad3e826d76
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceCore.java b/src/main/java/com/android/tools/r8/retrace/RetraceCore.java
index 8a4ef77..f783cbc 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceCore.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceCore.java
@@ -408,13 +408,13 @@
     }
 
     private String retracedFileName(String retracedClazz) {
+      if (!UNKNOWN_SOURCEFILE_NAMES.contains(fileName)) {
+        return fileName;
+      }
       if (retracedClazz == null) {
         // We have no new information, only rewrite filename if it is empty or SourceFile.
         // PG-retrace will always rewrite the filename, but that seems a bit to harsh to do.
-        if (UNKNOWN_SOURCEFILE_NAMES.contains(fileName)) {
-          return getClassSimpleName(clazz) + ".java";
-        }
-        return fileName;
+        return getClassSimpleName(clazz) + ".java";
       }
       String newFileName = getClassSimpleName(retracedClazz);
       String extension = Files.getFileExtension(fileName);
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
index 1cf135d..f1419cf 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.naming.retrace;
 
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
 import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileName;
 import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -63,6 +64,21 @@
     assertEquals("-.java", lambdaFrames.get(0).fileName);
   }
 
+  private void checkIsSame(StackTrace actualStackTrace, StackTrace retracedStackTrace) {
+    // Even when SourceFile is present retrace replaces the file name in the stack trace.
+    if (parameters.isCfRuntime()) {
+      assertThat(retracedStackTrace, isSame(expectedStackTrace));
+    } else {
+      // With the frame from the lambda class filtered out the stack trace is the same.
+      assertThat(
+          retracedStackTrace.filter(line -> !isSynthesizedLambdaFrame(line)),
+          isSame(expectedStackTrace));
+      // Check the frame from the lambda class.
+      checkLambdaFrame(retracedStackTrace);
+    }
+    assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+  }
+
   private void checkIsSameExceptForFileName(
       StackTrace actualStackTrace, StackTrace retracedStackTrace) {
     // Even when SourceFile is present retrace replaces the file name in the stack trace.
@@ -97,9 +113,7 @@
 
   @Test
   public void testSourceFileAndLineNumberTable() throws Exception {
-    runTest(
-        ImmutableList.of("-keepattributes SourceFile,LineNumberTable"),
-        this::checkIsSameExceptForFileName);
+    runTest(ImmutableList.of("-keepattributes SourceFile,LineNumberTable"), this::checkIsSame);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
index 47a4ad7..4ffc7de 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.naming.retrace;
 
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
 import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileName;
 import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -46,8 +47,7 @@
     runTest(
         ImmutableList.of("-keepattributes SourceFile,LineNumberTable"),
         (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
-          // Even when SourceFile is present retrace replaces the file name in the stack trace.
-          assertThat(retracedStackTrace, isSameExceptForFileName(expectedStackTrace));
+          assertThat(retracedStackTrace, isSame(expectedStackTrace));
           assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
         });
   }