[Retrace] Add getter for RetracedSourceFile on proxy

Change-Id: I4546db5453510dbb18b2312e96943aedff505dfc
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java b/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
index 7f4747a..714e2b9 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
@@ -43,6 +43,8 @@
 
   String getSourceFile();
 
+  RetracedSourceFile getRetracedSourceFile();
+
   int getLineNumber();
 
   RetraceStackTraceContext getContext();
diff --git a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
index 5e6b29b..2c030f7 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
@@ -10,6 +10,10 @@
 @Keep
 public interface RetracedClassReference {
 
+  boolean isUnknown();
+
+  boolean isKnown();
+
   String getTypeName();
 
   String getDescriptor();
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 dc90e36..98ed799 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
@@ -212,9 +212,8 @@
     return new RetraceClassElementImpl(
         this,
         RetracedClassReferenceImpl.create(
-            mapper == null
-                ? obfuscatedReference
-                : Reference.classFromTypeName(mapper.originalName)),
+            mapper == null ? obfuscatedReference : Reference.classFromTypeName(mapper.originalName),
+            mapper != null),
         mapper);
   }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
index afade35..e405443 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
@@ -64,7 +64,8 @@
                                 ? RetracedClassReferenceImpl.create(
                                     Reference.classFromDescriptor(
                                         DescriptorUtils.javaTypeToDescriptor(
-                                            fieldSignature.toHolderFromQualified())))
+                                            fieldSignature.toHolderFromQualified())),
+                                    true)
                                 : classElement.getRetracedClass();
                         return new ElementImpl(
                             this,
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
index e5d0df2..e3d5dc2 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
@@ -43,9 +43,8 @@
     return new RetraceThrownExceptionElementImpl(
         this,
         RetracedClassReferenceImpl.create(
-            mapper == null
-                ? obfuscatedReference
-                : Reference.classFromTypeName(mapper.originalName)),
+            mapper == null ? obfuscatedReference : Reference.classFromTypeName(mapper.originalName),
+            mapper != null),
         mapper,
         obfuscatedReference);
   }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
index d036009..326b157 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
@@ -10,14 +10,27 @@
 public final class RetracedClassReferenceImpl implements RetracedClassReference {
 
   private final ClassReference classReference;
+  private final boolean hasResult;
 
-  private RetracedClassReferenceImpl(ClassReference classReference) {
+  private RetracedClassReferenceImpl(ClassReference classReference, boolean hasResult) {
     assert classReference != null;
     this.classReference = classReference;
+    this.hasResult = hasResult;
   }
 
-  public static RetracedClassReferenceImpl create(ClassReference classReference) {
-    return new RetracedClassReferenceImpl(classReference);
+  public static RetracedClassReferenceImpl create(
+      ClassReference classReference, boolean hasResult) {
+    return new RetracedClassReferenceImpl(classReference, hasResult);
+  }
+
+  @Override
+  public boolean isUnknown() {
+    return !isKnown();
+  }
+
+  @Override
+  public boolean isKnown() {
+    return hasResult;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
index 8316a3b..304462e 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
@@ -49,7 +49,7 @@
 
     @Override
     public RetracedClassReferenceImpl getHolderClass() {
-      return RetracedClassReferenceImpl.create(fieldReference.getHolderClass());
+      return RetracedClassReferenceImpl.create(fieldReference.getHolderClass(), true);
     }
 
     @Override
@@ -95,7 +95,7 @@
 
     @Override
     public RetracedClassReferenceImpl getHolderClass() {
-      return RetracedClassReferenceImpl.create(fieldDefinition.getHolderClass());
+      return RetracedClassReferenceImpl.create(fieldDefinition.getHolderClass(), false);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
index f896692..8d7d20f 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
@@ -99,7 +99,7 @@
 
     @Override
     public RetracedClassReferenceImpl getHolderClass() {
-      return RetracedClassReferenceImpl.create(methodReference.getHolderClass());
+      return RetracedClassReferenceImpl.create(methodReference.getHolderClass(), true);
     }
 
     @Override
@@ -153,7 +153,7 @@
 
     @Override
     public RetracedClassReferenceImpl getHolderClass() {
-      return RetracedClassReferenceImpl.create(methodDefinition.getHolderClass());
+      return RetracedClassReferenceImpl.create(methodDefinition.getHolderClass(), false);
     }
 
     @Override
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 c907105..86e9046 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
@@ -103,11 +103,7 @@
         .joinAmbiguous(classResult.isAmbiguous())
         .setTopFrame(true)
         .setContext(thrownExceptionElement.getContext())
-        .apply(
-            setSourceFileOnProxy(
-                thrownExceptionElement::getSourceFile,
-                thrownExceptionElement.getRetracedClass(),
-                classResult))
+        .apply(setSourceFileOnProxy(thrownExceptionElement::getSourceFile))
         .build();
   }
 
@@ -143,11 +139,7 @@
                                         .applyIf(
                                             element.hasLineNumber(),
                                             b -> b.setLineNumber(element.getLineNumber()))
-                                        .apply(
-                                            setSourceFileOnProxy(
-                                                classElement::getSourceFile,
-                                                classElement.getRetracedClass(),
-                                                classResult))
+                                        .apply(setSourceFileOnProxy(classElement::getSourceFile))
                                         .build());
                       }
                       return frameResult.stream()
@@ -160,7 +152,6 @@
                                         singleFrame ->
                                             buildProxyForRewrittenFrameElement(
                                                 element,
-                                                classResult,
                                                 proxy,
                                                 frameResult,
                                                 frameElement,
@@ -172,7 +163,6 @@
 
   private RetraceStackTraceElementProxyImpl<T, ST> buildProxyForRewrittenFrameElement(
       ST element,
-      RetraceClassResult classResult,
       RetraceStackTraceElementProxyImpl<T, ST> proxy,
       RetraceFrameResult frameResult,
       RetraceFrameElement frameElement,
@@ -188,12 +178,9 @@
         .setContext(frameElement.getRetraceStackTraceContext())
         .applyIf(
             element.hasLineNumber(),
-            builder -> {
-              builder.setLineNumber(method.getOriginalPositionOrDefault(element.getLineNumber()));
-            })
-        .apply(
-            setSourceFileOnProxy(
-                () -> frameElement.getSourceFile(method), method.getHolderClass(), classResult))
+            builder ->
+                builder.setLineNumber(method.getOriginalPositionOrDefault(element.getLineNumber())))
+        .apply(setSourceFileOnProxy(() -> frameElement.getSourceFile(method)))
         .build();
   }
 
@@ -213,13 +200,12 @@
                           .map(
                               fieldElement ->
                                   buildProxyForRewrittenFieldElement(
-                                      classResult, proxy, retraceFieldResult, fieldElement));
+                                      proxy, retraceFieldResult, fieldElement));
                     }))
         .build();
   }
 
   private RetraceStackTraceElementProxyImpl<T, ST> buildProxyForRewrittenFieldElement(
-      RetraceClassResult classResult,
       RetraceStackTraceElementProxyImpl<T, ST> proxy,
       RetraceFieldResult retraceFieldResult,
       RetraceFieldElement fieldElement) {
@@ -229,27 +215,18 @@
         .setRetracedField(fieldElement.getField())
         .joinAmbiguous(retraceFieldResult.isAmbiguous())
         .setTopFrame(true)
-        .apply(
-            setSourceFileOnProxy(
-                fieldElement::getSourceFile, fieldElement.getField().getHolderClass(), classResult))
+        .apply(setSourceFileOnProxy(fieldElement::getSourceFile))
         .build();
   }
 
   private Consumer<RetraceStackTraceElementProxyImpl.Builder<T, ST>> setSourceFileOnProxy(
-      Supplier<RetracedSourceFile> sourceFile,
-      RetracedClassReference classReference,
-      RetraceClassResult classResult) {
+      Supplier<RetracedSourceFile> sourceFile) {
     return proxy -> {
       ST original = proxy.originalElement;
       if (!original.hasSourceFile()) {
         return;
       }
-      RetracedSourceFile retracedSourceFile = sourceFile.get();
-      proxy.setSourceFile(
-          retracedSourceFile.hasRetraceResult()
-              ? retracedSourceFile.getSourceFile()
-              : RetraceUtils.inferSourceFile(
-                  classReference.getTypeName(), original.getSourceFile(), classResult.isEmpty()));
+      proxy.setSourceFile(sourceFile.get());
     };
   }
 
@@ -351,7 +328,7 @@
     private final RetracedFieldReference retracedField;
     private final RetracedTypeReference fieldOrReturnType;
     private final List<RetracedTypeReference> methodArguments;
-    private final String sourceFile;
+    private final RetracedSourceFile sourceFile;
     private final int lineNumber;
     private final boolean isAmbiguous;
     private final boolean isTopFrame;
@@ -364,7 +341,7 @@
         RetracedFieldReference retracedField,
         RetracedTypeReference fieldOrReturnType,
         List<RetracedTypeReference> methodArguments,
-        String sourceFile,
+        RetracedSourceFile sourceFile,
         int lineNumber,
         boolean isAmbiguous,
         boolean isTopFrame,
@@ -460,6 +437,17 @@
 
     @Override
     public String getSourceFile() {
+      if (sourceFile != null && sourceFile.hasRetraceResult()) {
+        return sourceFile.getSourceFile();
+      }
+      String originalSourceFile =
+          originalItem.getSourceFile() == null ? "" : originalItem.getSourceFile();
+      return RetraceUtils.inferSourceFile(
+          retracedClass.getTypeName(), originalSourceFile, retracedClass.isKnown());
+    }
+
+    @Override
+    public RetracedSourceFile getRetracedSourceFile() {
       return sourceFile;
     }
 
@@ -549,7 +537,7 @@
       private RetracedFieldReference retracedField;
       private RetracedTypeReference fieldOrReturnType;
       private List<RetracedTypeReference> methodArguments;
-      private String sourceFile;
+      private RetracedSourceFile sourceFile;
       private int lineNumber = -1;
       private boolean isAmbiguous;
       private boolean isTopFrame;
@@ -584,7 +572,8 @@
         return this;
       }
 
-      private Builder<T, ST> setSourceFile(String sourceFile) {
+      private Builder<T, ST> setSourceFile(RetracedSourceFile sourceFile) {
+        assert sourceFile != null;
         this.sourceFile = sourceFile;
         return this;
       }
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
index 7744c14..889f0d9 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
@@ -50,7 +50,7 @@
               .getResult()
               .get(0)
               .get(0);
-      assertEquals("com.android.tools.R8.a(Unknown Source)", stringRetraceStackFrameResult.get(0));
+      assertEquals("com.android.tools.R8.a(R8.java)", stringRetraceStackFrameResult.get(0));
     }
 
     public static class TestProxy extends StackTraceElementProxy<String, TestProxy> {
@@ -133,7 +133,7 @@
             + "."
             + getMethodName()
             + "("
-            + retracedProxy.getSourceFile()
+            + retracedProxy.getRetracedSourceFile().getOrInferSourceFile()
             + ")";
       }
     }