Rewrite existing retrace tool to use new api

Bug: 144151634
Change-Id: I7289165223c5f969006e1e619cbe34cc31a5743d
diff --git a/src/main/java/com/android/tools/r8/retrace/Retrace.java b/src/main/java/com/android/tools/r8/retrace/Retrace.java
index 591ec89..b485868 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -11,7 +11,7 @@
 import com.android.tools.r8.naming.ClassNameMapper;
 import com.android.tools.r8.retrace.RetraceCommand.Builder;
 import com.android.tools.r8.retrace.RetraceCommand.ProguardMapProducer;
-import com.android.tools.r8.retrace.RetraceCore.RetraceResult;
+import com.android.tools.r8.retrace.RetraceStackTrace.RetraceResult;
 import com.android.tools.r8.utils.OptionsParsing;
 import com.android.tools.r8.utils.OptionsParsing.ParseContext;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -117,8 +117,9 @@
     try {
       ClassNameMapper classNameMapper =
           ClassNameMapper.mapperFromString(command.proguardMapProducer.get());
+      RetraceBase retraceBase = new RetraceBaseImpl(classNameMapper);
       RetraceResult result =
-          new RetraceCore(classNameMapper, command.stackTrace, command.diagnosticsHandler)
+          new RetraceStackTrace(retraceBase, command.stackTrace, command.diagnosticsHandler)
               .retrace();
       command.retracedStackTraceConsumer.accept(result.toListOfStrings());
     } catch (IOException ex) {
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceCore.java b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
similarity index 73%
rename from src/main/java/com/android/tools/r8/retrace/RetraceCore.java
rename to src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
index d895d8d..1dd8cec 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceCore.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
@@ -7,22 +7,18 @@
 import static com.google.common.base.Predicates.not;
 
 import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
-import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Sets;
-import com.google.common.io.Files;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Set;
 import java.util.function.Predicate;
 
-public final class RetraceCore {
+public final class RetraceStackTrace {
 
   public static class StackTraceNode {
 
@@ -100,15 +96,13 @@
     }
   }
 
-  private final ClassNameMapper classNameMapper;
+  private final RetraceBase retraceBase;
   private final List<String> stackTrace;
   private final DiagnosticsHandler diagnosticsHandler;
 
-  RetraceCore(
-      ClassNameMapper classNameMapper,
-      List<String> stackTrace,
-      DiagnosticsHandler diagnosticsHandler) {
-    this.classNameMapper = classNameMapper;
+  RetraceStackTrace(
+      RetraceBase retraceBase, List<String> stackTrace, DiagnosticsHandler diagnosticsHandler) {
+    this.retraceBase = retraceBase;
     this.stackTrace = stackTrace;
     this.diagnosticsHandler = diagnosticsHandler;
   }
@@ -124,14 +118,15 @@
       return;
     }
     StackTraceLine stackTraceLine = parseLine(index + 1, stackTrace.get(index));
-    List<StackTraceLine> retraced = stackTraceLine.retrace(classNameMapper);
+    List<StackTraceLine> retraced = stackTraceLine.retrace(retraceBase);
     StackTraceNode node = new StackTraceNode(retraced);
     result.add(node);
     retraceLine(stackTrace, index + 1, result);
   }
 
   abstract static class StackTraceLine {
-    abstract List<StackTraceLine> retrace(ClassNameMapper mapper);
+
+    abstract List<StackTraceLine> retrace(RetraceBase retraceBase);
 
     static int firstNonWhiteSpaceCharacterFromIndex(String line, int index) {
       return firstFromIndex(line, index, not(Character::isWhitespace));
@@ -150,13 +145,21 @@
       return line.length();
     }
 
+    boolean isAtLine() {
+      return false;
+    }
+
     AtLine asAtLine() {
       return null;
     }
 
-    boolean isAtLine() {
+    boolean isExceptionLine() {
       return false;
     }
+
+    ExceptionLine asExceptionLine() {
+      return null;
+    }
   }
 
   /**
@@ -223,20 +226,35 @@
     }
 
     @Override
-    List<StackTraceLine> retrace(ClassNameMapper mapper) {
-      ClassNamingForNameMapper classNaming = mapper.getClassNaming(exceptionClass);
-      String retracedExceptionClass = exceptionClass;
-      if (classNaming != null) {
-        retracedExceptionClass = classNaming.originalName;
-      }
-      return ImmutableList.of(
-          new ExceptionLine(initialWhiteSpace, description, retracedExceptionClass, message));
+    List<StackTraceLine> retrace(RetraceBase retraceBase) {
+      List<StackTraceLine> exceptionLines = new ArrayList<>();
+      retraceBase
+          .retrace(Reference.classFromTypeName(exceptionClass))
+          .apply(
+              element ->
+                  exceptionLines.add(
+                      new ExceptionLine(
+                          initialWhiteSpace,
+                          description,
+                          element.getClassReference().getTypeName(),
+                          message)));
+      return exceptionLines;
     }
 
     @Override
     public String toString() {
       return initialWhiteSpace + description + exceptionClass + message;
     }
+
+    @Override
+    boolean isExceptionLine() {
+      return true;
+    }
+
+    @Override
+    ExceptionLine asExceptionLine() {
+      return this;
+    }
   }
 
   /**
@@ -253,9 +271,6 @@
    */
   static class AtLine extends StackTraceLine {
 
-    private static final Set<String> UNKNOWN_SOURCEFILE_NAMES =
-        Sets.newHashSet("", "SourceFile", "Unknown", "Unknown Source");
-
     private static final int NO_POSITION = -2;
     private static final int INVALID_POSITION = -1;
 
@@ -341,97 +356,38 @@
           false);
     }
 
+    private boolean hasLinePosition() {
+      return linePosition > -1;
+    }
+
     @Override
-    List<StackTraceLine> retrace(ClassNameMapper mapper) {
-      ClassNamingForNameMapper classNaming = mapper.getClassNaming(clazz);
+    List<StackTraceLine> retrace(RetraceBase retraceBase) {
       List<StackTraceLine> lines = new ArrayList<>();
-      if (classNaming == null) {
-        lines.add(
-            new AtLine(
-                startingWhitespace,
-                at,
-                clazz,
-                method,
-                retracedFileName(null),
-                linePosition,
-                false));
-        return lines;
-      }
-      String retraceClazz = classNaming.originalName;
-      MappedRangesOfName mappedRangesOfName = classNaming.mappedRangesByRenamedName.get(method);
-      if (mappedRangesOfName == null || mappedRangesOfName.getMappedRanges() == null) {
-        lines.add(
-            new AtLine(
-                startingWhitespace,
-                at,
-                retraceClazz,
-                method,
-                retracedFileName(retraceClazz),
-                linePosition,
-                false));
-        return lines;
-      }
-      boolean isAmbiguous = linePosition <= 0;
-      List<MappedRange> mappedRanges =
-          linePosition >= 0
-              ? mappedRangesOfName.allRangesForLine(linePosition, false)
-              : mappedRangesOfName.getMappedRanges();
-      if (mappedRanges == null || mappedRanges.isEmpty()) {
-        // We have no idea of where we are, the best we can do is report all.
-        mappedRanges = mappedRangesOfName.getMappedRanges();
-        isAmbiguous = true;
-        assert mappedRanges != null;
-      }
-      for (MappedRange mappedRange : mappedRanges) {
-        String mappedClazz = retraceClazz;
-        String mappedMethod = mappedRange.signature.name;
-        if (mappedRange.signature.isQualified()) {
-          mappedClazz = mappedRange.signature.toHolderFromQualified();
-          mappedMethod = mappedRange.signature.toUnqualifiedName();
-        }
-        int retracedLinePosition = linePosition;
-        if (linePosition > 0) {
-          retracedLinePosition = mappedRange.getOriginalLineNumber(linePosition);
-        }
-        lines.add(
-            new AtLine(
-                startingWhitespace,
-                at,
-                mappedClazz,
-                mappedMethod,
-                retracedFileName(mappedClazz),
-                retracedLinePosition,
-                isAmbiguous));
-      }
-      assert !lines.isEmpty();
+      ClassReference classReference = Reference.classFromTypeName(clazz);
+      RetraceMethodResult retraceMethodResult =
+          retraceBase
+              .retrace(classReference)
+              .lookupMethod(method)
+              .narrowByLine(linePosition)
+              .apply(
+                  methodElement -> {
+                    MethodReference methodReference = methodElement.getMethodReference();
+                    lines.add(
+                        new AtLine(
+                            startingWhitespace,
+                            at,
+                            methodReference.getHolderClass().getTypeName(),
+                            methodReference.getMethodName(),
+                            retraceBase.retraceSourceFile(
+                                classReference, fileName, methodReference.getHolderClass(), true),
+                            hasLinePosition()
+                                ? methodElement.getOriginalLineNumber(linePosition)
+                                : linePosition,
+                            methodElement.getRetraceMethodResult().isAmbiguous()));
+                  });
       return lines;
     }
 
-    private String retracedFileName(String retracedClazz) {
-      boolean fileNameProbablyChanged = retracedClazz != null && !retracedClazz.startsWith(clazz);
-      if (!UNKNOWN_SOURCEFILE_NAMES.contains(fileName) && !fileNameProbablyChanged) {
-        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.
-        return getClassSimpleName(clazz) + ".java";
-      }
-      String newFileName = getClassSimpleName(retracedClazz);
-      String extension = Files.getFileExtension(fileName);
-      if (extension.isEmpty()) {
-        extension = "java";
-      }
-      return newFileName + "." + extension;
-    }
-
-    private String getClassSimpleName(String clazz) {
-      int lastIndexOfPeriod = clazz.lastIndexOf('.');
-      // Check if we can find a subclass separator.
-      int endIndex = firstCharFromIndex(clazz, lastIndexOfPeriod + 1, '$');
-      return clazz.substring(lastIndexOfPeriod + 1, endIndex);
-    }
-
     @Override
     public String toString() {
       return toString(at, "");
@@ -498,7 +454,7 @@
     }
 
     @Override
-    List<StackTraceLine> retrace(ClassNameMapper mapper) {
+    List<StackTraceLine> retrace(RetraceBase retraceBase) {
       return ImmutableList.of(new MoreLine(line));
     }
 
@@ -516,7 +472,7 @@
     }
 
     @Override
-    List<StackTraceLine> retrace(ClassNameMapper mapper) {
+    List<StackTraceLine> retrace(RetraceBase retraceBase) {
       return ImmutableList.of(new UnknownLine(line));
     }