[Retrace] Use original source file names for all classes

Bug: b/226885646
Bug: b/234361164
Change-Id: I7a8a07e5c6bb9b8ebfa27b98fc7a63ce564b8ea6
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
index b29dbc6..9f01beb 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMapper.java
@@ -47,19 +47,20 @@
 
     private final Map<String, ClassNamingForNameMapper.Builder> mapping = new HashMap<>();
     private LinkedHashSet<MapVersionMappingInformation> mapVersions = new LinkedHashSet<>();
+    private final Map<String, String> originalSourceFiles = new HashMap<>();
 
     @Override
     public ClassNamingForNameMapper.Builder classNamingBuilder(
         String renamedName, String originalName, Position position) {
       ClassNamingForNameMapper.Builder classNamingBuilder =
-          ClassNamingForNameMapper.builder(renamedName, originalName);
+          ClassNamingForNameMapper.builder(renamedName, originalName, originalSourceFiles::put);
       mapping.put(renamedName, classNamingBuilder);
       return classNamingBuilder;
     }
 
     @Override
     public ClassNameMapper build() {
-      return new ClassNameMapper(buildClassNameMappings(), mapVersions);
+      return new ClassNameMapper(buildClassNameMappings(), mapVersions, originalSourceFiles);
     }
 
     private ImmutableMap<String, ClassNamingForNameMapper> buildClassNameMappings() {
@@ -177,12 +178,15 @@
   private BiMapContainer<String, String> nameMapping;
   private final Map<Signature, Signature> signatureMap = new HashMap<>();
   private final Set<MapVersionMappingInformation> mapVersions;
+  private final Map<String, String> originalSourceFiles;
 
   private ClassNameMapper(
       ImmutableMap<String, ClassNamingForNameMapper> classNameMappings,
-      Set<MapVersionMappingInformation> mapVersions) {
+      Set<MapVersionMappingInformation> mapVersions,
+      Map<String, String> originalSourceFiles) {
     this.classNameMappings = classNameMappings;
     this.mapVersions = mapVersions;
+    this.originalSourceFiles = originalSourceFiles;
   }
 
   public Map<String, ClassNamingForNameMapper> getClassNameMappings() {
@@ -234,6 +238,10 @@
     return descriptorToJavaType(asString, this);
   }
 
+  public String getSourceFile(String typeName) {
+    return originalSourceFiles.get(typeName);
+  }
+
   @Override
   public boolean hasMapping(DexType type) {
     String decoded = descriptorToJavaType(type.descriptor.toString());
@@ -258,7 +266,7 @@
     ImmutableMap.Builder<String, ClassNamingForNameMapper> builder = ImmutableMap.builder();
     builder.orderEntriesByValue(Comparator.comparing(x -> x.originalName));
     classNameMappings.forEach(builder::put);
-    return new ClassNameMapper(builder.build(), mapVersions);
+    return new ClassNameMapper(builder.build(), mapVersions, originalSourceFiles);
   }
 
   public boolean verifyIsSorted() {
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 373f584..c1e5de7 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -23,6 +23,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -43,10 +44,15 @@
     private final Map<String, List<MappedRange>> mappedRangesByName = Maps.newHashMap();
     private final Map<String, List<MemberNaming>> mappedFieldNamingsByName = Maps.newHashMap();
     private final List<MappingInformation> additionalMappingInfo = new ArrayList<>();
+    private final BiConsumer<String, String> originalSourceFileConsumer;
 
-    private Builder(String renamedName, String originalName) {
+    private Builder(
+        String renamedName,
+        String originalName,
+        BiConsumer<String, String> originalSourceFileConsumer) {
       this.originalName = originalName;
       this.renamedName = renamedName;
+      this.originalSourceFileConsumer = originalSourceFileConsumer;
     }
 
     @Override
@@ -108,6 +114,9 @@
         }
       }
       additionalMappingInfo.add(info);
+      if (info.isFileNameInformation()) {
+        originalSourceFileConsumer.accept(originalName, info.asFileNameInformation().getFileName());
+      }
     }
   }
 
@@ -205,8 +214,11 @@
     }
   }
 
-  static Builder builder(String renamedName, String originalName) {
-    return new Builder(renamedName, originalName);
+  static Builder builder(
+      String renamedName,
+      String originalName,
+      BiConsumer<String, String> originalSourceFileConsumer) {
+    return new Builder(renamedName, originalName, originalSourceFileConsumer);
   }
 
   public final String originalName;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java b/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java
index 1ff65a4..13187cc 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/MappingProviderInternal.java
@@ -12,5 +12,7 @@
 
   abstract ClassNamingForNameMapper getClassNaming(String typeName);
 
+  abstract String getSourceFileForClass(String typeName);
+
   abstract Set<MapVersionMappingInformation> getMapVersions();
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java
index dcfe2cb..c15efef 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderImpl.java
@@ -43,4 +43,9 @@
     }
     return classNameMapper.getClassNaming(typeName);
   }
+
+  @Override
+  String getSourceFileForClass(String typeName) {
+    return classNameMapper.getSourceFile(typeName);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
index 7f71ad6..80931c3 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
@@ -201,16 +201,7 @@
 
     @Override
     public RetracedSourceFile getSourceFile() {
-      String sourceFile = null;
-      if (mapper != null) {
-        for (MappingInformation info : mapper.getAdditionalMappingInfo()) {
-          if (info.isFileNameInformation()) {
-            sourceFile = info.asFileNameInformation().getFileName();
-            break;
-          }
-        }
-      }
-      return new RetracedSourceFileImpl(getRetracedClass().getClassReference(), sourceFile);
+      return RetraceUtils.getSourceFile(classReference, classResult.retracer);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
index 0aa210c..8243d4a 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
@@ -221,7 +221,7 @@
 
   @Override
   public boolean isEmpty() {
-    return !mappedRanges.isEmpty();
+    return mappedRanges.isEmpty();
   }
 
   public static class ElementImpl implements RetraceFrameElement {
@@ -348,8 +348,7 @@
 
     @Override
     public RetracedSourceFile getSourceFile(RetracedClassMemberReference frame) {
-      return RetraceUtils.getSourceFileOrLookup(
-          frame.getHolderClass(), classElement, retraceFrameResult.retracer);
+      return RetraceUtils.getSourceFile(frame.getHolderClass(), retraceFrameResult.retracer);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
index e5a2579..af8526c 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
@@ -197,8 +197,8 @@
 
     @Override
     public RetracedSourceFile getSourceFile() {
-      return RetraceUtils.getSourceFileOrLookup(
-          methodReference.getHolderClass(), classElement, retraceMethodResult.retracer);
+      return RetraceUtils.getSourceFile(
+          methodReference.getHolderClass(), retraceMethodResult.retracer);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
index c4ed860..2e1411a 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
@@ -12,14 +12,10 @@
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.references.TypeReference;
-import com.android.tools.r8.retrace.RetraceClassElement;
-import com.android.tools.r8.retrace.RetraceClassResult;
 import com.android.tools.r8.retrace.RetracedClassReference;
 import com.android.tools.r8.retrace.RetracedMethodReference;
 import com.android.tools.r8.retrace.RetracedMethodReference.KnownRetracedMethodReference;
 import com.android.tools.r8.retrace.RetracedSourceFile;
-import com.android.tools.r8.retrace.Retracer;
-import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
@@ -75,16 +71,10 @@
     return clazz.substring(lastIndexOfPeriod + 1, endIndex);
   }
 
-  // TODO(b/226885646): Retracing of a source file should not be dependent on retraced information.
-  public static RetracedSourceFile getSourceFileOrLookup(
-      RetracedClassReference holder, RetraceClassElement context, Retracer retracer) {
-    if (holder.equals(context.getRetracedClass())) {
-      return context.getSourceFile();
-    }
-    RetraceClassResult contextClassResult = retracer.retraceClass(holder.getClassReference());
-    Box<RetracedSourceFile> retraceSourceFile = new Box<>();
-    contextClassResult.forEach(element -> retraceSourceFile.set(element.getSourceFile()));
-    return retraceSourceFile.get();
+  public static RetracedSourceFile getSourceFile(
+      RetracedClassReference holder, RetracerImpl retracer) {
+    ClassReference holderReference = holder.getClassReference();
+    return new RetracedSourceFileImpl(holderReference, retracer.getSourceFile(holderReference));
   }
 
   public static String inferSourceFile(
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
index 92e42f1..346b417 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracerImpl.java
@@ -87,6 +87,10 @@
     return classNameMapperProvider.getMapVersions();
   }
 
+  public String getSourceFile(ClassReference classReference) {
+    return classNameMapperProvider.getSourceFileForClass(classReference.getTypeName());
+  }
+
   public static Builder builder() {
     return new Builder();
   }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
index 987aead..a8b5e71 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
@@ -131,7 +131,7 @@
                                   ? OptionalInt.of(element.getLineNumber())
                                   : OptionalInt.empty(),
                               element.getMethodName());
-                      if (!frameResult.isEmpty()) {
+                      if (frameResult.isEmpty()) {
                         return classResult.stream()
                             .map(
                                 classElement ->
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineSourceFileStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineSourceFileStackTrace.java
index 069a7fd..9128e47 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineSourceFileStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineSourceFileStackTrace.java
@@ -29,15 +29,13 @@
   @Override
   public List<String> retracedStackTrace() {
     return Arrays.asList(
-        // TODO(b/234361164): Should have correct source file.
-        "  at foo.Bar.method(Bar.java:22)", "  at foo.Baz.main(SourceFile2.kt:32)");
+        "  at foo.Bar.method(SourceFile1.kt:22)", "  at foo.Baz.main(SourceFile2.kt:32)");
   }
 
   @Override
   public List<String> retraceVerboseStackTrace() {
     return Arrays.asList(
-        // TODO(b/234361164): Should have correct source file.
-        "  at foo.Bar.void method()(Bar.java:22)",
+        "  at foo.Bar.void method()(SourceFile1.kt:22)",
         "  at foo.Baz.void main(java.lang.String[])(SourceFile2.kt:32)");
   }