Clean-up retrace API

Bug: 159425023
Change-Id: I1023d8085837054abc5748d5780222cd66c0c0b1
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 90c1cca..0e2a16e 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -15,13 +15,9 @@
 import com.android.tools.r8.retrace.RetraceCommand.ProguardMapProducer;
 import com.android.tools.r8.retrace.internal.PlainStackTraceVisitor;
 import com.android.tools.r8.retrace.internal.RetraceAbortException;
-import com.android.tools.r8.retrace.internal.RetraceCommandLineResult;
 import com.android.tools.r8.retrace.internal.RetraceRegularExpression;
-import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.retrace.internal.StackTraceElementProxyRetracerImpl;
-import com.android.tools.r8.retrace.internal.StackTraceElementProxyRetracerImpl.RetraceStackTraceProxyImpl;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy;
-import com.android.tools.r8.retrace.internal.StackTraceVisitor;
 import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.ExceptionDiagnostic;
 import com.android.tools.r8.utils.OptionsParsing;
@@ -43,6 +39,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Scanner;
+import java.util.function.BiConsumer;
 
 /**
  * A retrace tool for obfuscated stack traces.
@@ -170,61 +167,32 @@
     try {
       Timing timing = Timing.create("R8 retrace", command.printMemory());
       timing.begin("Read proguard map");
-      RetracerImpl retracer =
-          RetracerImpl.create(command.proguardMapProducer, command.diagnosticsHandler);
+      Retracer retracer =
+          Retracer.createDefault(command.proguardMapProducer, command.diagnosticsHandler);
       timing.end();
-      RetraceCommandLineResult result;
       timing.begin("Parse and Retrace");
       StackTraceVisitor<StackTraceElementStringProxy> stackTraceVisitor =
           command.regularExpression != null
-              ? new RetraceRegularExpression(
-                  retracer, command.stackTrace, command.regularExpression)
+              ? new RetraceRegularExpression(command.stackTrace, command.regularExpression)
               : new PlainStackTraceVisitor(command.stackTrace, command.diagnosticsHandler);
-        StackTraceElementProxyRetracer<StackTraceElementStringProxy> proxyRetracer =
-            new StackTraceElementProxyRetracerImpl<>(retracer);
-        List<String> retracedStrings = new ArrayList<>();
-      stackTraceVisitor.forEach(
-          stackTraceElement -> {
-            Box<List<RetraceStackTraceProxyImpl<StackTraceElementStringProxy>>> currentList =
-                new Box<>();
-            Map<
-                    RetraceStackTraceProxyImpl<StackTraceElementStringProxy>,
-                    List<RetraceStackTraceProxyImpl<StackTraceElementStringProxy>>>
-                ambiguousBlocks = new HashMap<>();
-            proxyRetracer
-                .retrace(stackTraceElement)
-                .forEach(
-                    retracedElement -> {
-                      if (retracedElement.isTopFrame() || !retracedElement.hasRetracedClass()) {
-                        List<RetraceStackTraceProxyImpl<StackTraceElementStringProxy>> block =
-                            new ArrayList<>();
-                        ambiguousBlocks.put(retracedElement, block);
-                        currentList.set(block);
-                      }
-                      currentList.get().add(retracedElement);
-                    });
-            ambiguousBlocks.keySet().stream()
-                .sorted()
-                .forEach(
-                    topFrame -> {
-                      ambiguousBlocks
-                          .get(topFrame)
-                          .forEach(
-                              frame -> {
-                                StackTraceElementStringProxy originalItem = frame.getOriginalItem();
-                                retracedStrings.add(
-                                    originalItem.toRetracedItem(
-                                        frame, !currentList.isSet(), command.isVerbose));
-                                // Use the current list as indicator for us seeing the first
-                                // sorted element.
-                                currentList.set(null);
-                              });
-                    });
+      List<String> retracedStrings = new ArrayList<>();
+      Box<StackTraceElementStringProxy> lastReportedFrame = new Box<>();
+      run(
+          stackTraceVisitor,
+          new StackTraceElementProxyRetracerImpl<>(retracer),
+          (stackTraceElement, frames) -> {
+            frames.forEach(
+                frame -> {
+                  StackTraceElementStringProxy originalItem = frame.getOriginalItem();
+                  retracedStrings.add(
+                      originalItem.toRetracedItem(
+                          frame, lastReportedFrame.get() == stackTraceElement, command.isVerbose));
+                  lastReportedFrame.set(stackTraceElement);
+                });
           });
-        result = new RetraceCommandLineResult(retracedStrings);
       timing.end();
       timing.begin("Report result");
-      command.retracedStackTraceConsumer.accept(result.getNodes());
+      command.retracedStackTraceConsumer.accept(retracedStrings);
       timing.end();
       if (command.printTimes()) {
         timing.report();
@@ -235,6 +203,42 @@
     }
   }
 
+  /**
+   * Entry point for running retrace over visited stack traces.
+   *
+   * @param stackTraceVisitor the stack trace visitor.
+   * @param proxyRetracer the retracer used to parse each stack trace frame.
+   * @param resultConsumer consumer to accept each parsed stack trace frame. The stack-trace element
+   *     is guaranteed to be unique per line.
+   */
+  public static <T extends StackTraceElementProxy<?>> void run(
+      StackTraceVisitor<T> stackTraceVisitor,
+      StackTraceElementProxyRetracer<T> proxyRetracer,
+      BiConsumer<T, List<RetraceStackTraceProxy<T>>> resultConsumer) {
+    stackTraceVisitor.forEach(
+        stackTraceElement -> {
+          Box<List<RetraceStackTraceProxy<T>>> currentList = new Box<>();
+          Map<RetraceStackTraceProxy<T>, List<RetraceStackTraceProxy<T>>> ambiguousBlocks =
+              new HashMap<>();
+          proxyRetracer
+              .retrace(stackTraceElement)
+              .forEach(
+                  retracedElement -> {
+                    if (retracedElement.isTopFrame() || !retracedElement.hasRetracedClass()) {
+                      List<RetraceStackTraceProxy<T>> block = new ArrayList<>();
+                      ambiguousBlocks.put(retracedElement, block);
+                      currentList.set(block);
+                    }
+                    currentList.get().add(retracedElement);
+                  });
+          ambiguousBlocks.keySet().stream()
+              .sorted()
+              .forEach(
+                  topFrame ->
+                      resultConsumer.accept(stackTraceElement, ambiguousBlocks.get(topFrame)));
+        });
+  }
+
   public static void run(String[] args) throws RetraceFailedException {
     // To be compatible with standard retrace and remapper, we translate -arg into --arg.
     String[] mappedArgs = new String[args.length];
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
index f9d0d6f..6751a2a 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceClassResult.java
@@ -33,6 +33,8 @@
 
   RetraceClassResult forEach(Consumer<Element> resultConsumer);
 
+  boolean hasRetraceResult();
+
   boolean isAmbiguous();
 
   @Keep
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceInvalidStackTraceLineDiagnostics.java b/src/main/java/com/android/tools/r8/retrace/RetraceInvalidStackTraceLineDiagnostics.java
similarity index 92%
rename from src/main/java/com/android/tools/r8/retrace/internal/RetraceInvalidStackTraceLineDiagnostics.java
rename to src/main/java/com/android/tools/r8/retrace/RetraceInvalidStackTraceLineDiagnostics.java
index 547534f..d2a6827 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceInvalidStackTraceLineDiagnostics.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceInvalidStackTraceLineDiagnostics.java
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.retrace.internal;
+package com.android.tools.r8.retrace;
 
 import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.Keep;
@@ -40,7 +40,7 @@
     return message;
   }
 
-  static RetraceInvalidStackTraceLineDiagnostics createNull(int lineNumber) {
+  public static RetraceInvalidStackTraceLineDiagnostics createNull(int lineNumber) {
     return new RetraceInvalidStackTraceLineDiagnostics(lineNumber, NULL_STACK_TRACE_LINE_MESSAGE);
   }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/Retracer.java b/src/main/java/com/android/tools/r8/retrace/Retracer.java
index 57b7607..ed1d338 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retracer.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retracer.java
@@ -4,11 +4,14 @@
 
 package com.android.tools.r8.retrace;
 
+import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.TypeReference;
+import com.android.tools.r8.retrace.RetraceCommand.ProguardMapProducer;
+import com.android.tools.r8.retrace.internal.RetracerImpl;
 
 /** This is the main api interface for retrace. */
 @Keep
@@ -23,4 +26,9 @@
   RetraceFieldResult retraceField(FieldReference fieldReference);
 
   RetraceTypeResult retraceType(TypeReference typeReference);
+
+  static Retracer createDefault(
+      ProguardMapProducer proguardMapProducer, DiagnosticsHandler diagnosticsHandler) {
+    return RetracerImpl.create(proguardMapProducer, diagnosticsHandler);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/StackTraceElementProxyRetracer.java b/src/main/java/com/android/tools/r8/retrace/StackTraceElementProxyRetracer.java
index 17d9005..17de5f1 100644
--- a/src/main/java/com/android/tools/r8/retrace/StackTraceElementProxyRetracer.java
+++ b/src/main/java/com/android/tools/r8/retrace/StackTraceElementProxyRetracer.java
@@ -5,11 +5,16 @@
 package com.android.tools.r8.retrace;
 
 import com.android.tools.r8.Keep;
-import com.android.tools.r8.retrace.internal.StackTraceElementProxyRetracerImpl.RetraceStackTraceProxyImpl;
+import com.android.tools.r8.retrace.internal.StackTraceElementProxyRetracerImpl;
 import java.util.stream.Stream;
 
 @Keep
 public interface StackTraceElementProxyRetracer<T extends StackTraceElementProxy<?>> {
 
-  Stream<RetraceStackTraceProxyImpl<T>> retrace(T element);
+  Stream<RetraceStackTraceProxy<T>> retrace(T element);
+
+  static <T extends StackTraceElementProxy<?>> StackTraceElementProxyRetracer<T> createDefault(
+      Retracer retracer) {
+    return new StackTraceElementProxyRetracerImpl<>(retracer);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceVisitor.java b/src/main/java/com/android/tools/r8/retrace/StackTraceVisitor.java
similarity index 77%
rename from src/main/java/com/android/tools/r8/retrace/internal/StackTraceVisitor.java
rename to src/main/java/com/android/tools/r8/retrace/StackTraceVisitor.java
index dfe937a..bf2de73 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceVisitor.java
+++ b/src/main/java/com/android/tools/r8/retrace/StackTraceVisitor.java
@@ -2,11 +2,12 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-package com.android.tools.r8.retrace.internal;
+package com.android.tools.r8.retrace;
 
-import com.android.tools.r8.retrace.StackTraceElementProxy;
+import com.android.tools.r8.Keep;
 import java.util.function.Consumer;
 
+@Keep
 public interface StackTraceVisitor<T extends StackTraceElementProxy<?>> {
 
   void forEach(Consumer<T> consumer);
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java b/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
index 7f7d7fc..45b0c28 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
@@ -7,6 +7,8 @@
 import static com.google.common.base.Predicates.not;
 
 import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.retrace.RetraceInvalidStackTraceLineDiagnostics;
+import com.android.tools.r8.retrace.StackTraceVisitor;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy.ClassNameType;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy.StackTraceElementStringProxyBuilder;
 import com.android.tools.r8.utils.DescriptorUtils;
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 45b7fdd..15fdfdc 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
@@ -17,6 +17,7 @@
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetraceClassResult;
 import com.android.tools.r8.retrace.RetraceFrameResult;
+import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
@@ -29,17 +30,17 @@
 
   private final ClassReference obfuscatedReference;
   private final ClassNamingForNameMapper mapper;
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
   private RetraceClassResultImpl(
-      ClassReference obfuscatedReference, ClassNamingForNameMapper mapper, RetracerImpl retracer) {
+      ClassReference obfuscatedReference, ClassNamingForNameMapper mapper, Retracer retracer) {
     this.obfuscatedReference = obfuscatedReference;
     this.mapper = mapper;
     this.retracer = retracer;
   }
 
   static RetraceClassResultImpl create(
-      ClassReference obfuscatedReference, ClassNamingForNameMapper mapper, RetracerImpl retracer) {
+      ClassReference obfuscatedReference, ClassNamingForNameMapper mapper, Retracer retracer) {
     return new RetraceClassResultImpl(obfuscatedReference, mapper, retracer);
   }
 
@@ -162,7 +163,8 @@
         : mappedRangesForPosition;
   }
 
-  boolean hasRetraceResult() {
+  @Override
+  public boolean hasRetraceResult() {
     return mapper != null;
   }
 
@@ -196,7 +198,7 @@
         RetraceClassResultImpl classResult,
         List<Pair<ElementImpl, T>> mappings,
         D definition,
-        RetracerImpl retracer);
+        Retracer retracer);
   }
 
   @Override
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 3a65b0a..73b7dbd 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
@@ -4,31 +4,30 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.retrace.RetraceFieldResult;
 import com.android.tools.r8.retrace.RetraceSourceFileResult;
+import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.Pair;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
-@Keep
 public class RetraceFieldResultImpl implements RetraceFieldResult {
 
   private final RetraceClassResultImpl classResult;
   private final List<Pair<RetraceClassResultImpl.ElementImpl, List<MemberNaming>>> memberNamings;
   private final FieldDefinition fieldDefinition;
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
   RetraceFieldResultImpl(
       RetraceClassResultImpl classResult,
       List<Pair<RetraceClassResultImpl.ElementImpl, List<MemberNaming>>> memberNamings,
       FieldDefinition fieldDefinition,
-      RetracerImpl retracer) {
+      Retracer retracer) {
     this.classResult = classResult;
     this.memberNamings = memberNamings;
     this.fieldDefinition = fieldDefinition;
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 24c5a8e..35f1f63 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
@@ -13,6 +13,7 @@
 import com.android.tools.r8.retrace.RetraceSourceFileResult;
 import com.android.tools.r8.retrace.RetracedClassMember;
 import com.android.tools.r8.retrace.RetracedMethod;
+import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -29,14 +30,14 @@
   private final MethodDefinition methodDefinition;
   private final int obfuscatedPosition;
   private final List<Pair<RetraceClassResultImpl.ElementImpl, List<MappedRange>>> mappedRanges;
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
   public RetraceFrameResultImpl(
       RetraceClassResultImpl classResult,
       List<Pair<RetraceClassResultImpl.ElementImpl, List<MappedRange>>> mappedRanges,
       MethodDefinition methodDefinition,
       int obfuscatedPosition,
-      RetracerImpl retracer) {
+      Retracer retracer) {
     this.classResult = classResult;
     this.methodDefinition = methodDefinition;
     this.obfuscatedPosition = obfuscatedPosition;
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 93fa544..46d63bc 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
@@ -4,11 +4,11 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.retrace.RetraceMethodResult;
+import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
@@ -16,19 +16,18 @@
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
-@Keep
 public class RetraceMethodResultImpl implements RetraceMethodResult {
 
   private final MethodDefinition methodDefinition;
   private final RetraceClassResultImpl classResult;
   private final List<Pair<RetraceClassResultImpl.ElementImpl, List<MappedRange>>> mappedRanges;
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
   RetraceMethodResultImpl(
       RetraceClassResultImpl classResult,
       List<Pair<RetraceClassResultImpl.ElementImpl, List<MappedRange>>> mappedRanges,
       MethodDefinition methodDefinition,
-      RetracerImpl retracer) {
+      Retracer retracer) {
     this.classResult = classResult;
     this.mappedRanges = mappedRanges;
     this.methodDefinition = methodDefinition;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
index ca9a2f8..e5a2906 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.retrace.internal;
 
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.retrace.StackTraceVisitor;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy.ClassNameType;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy.StackTraceElementStringProxyBuilder;
 import java.util.ArrayList;
@@ -15,7 +16,6 @@
 
 public class RetraceRegularExpression implements StackTraceVisitor<StackTraceElementStringProxy> {
 
-  private final RetracerImpl retracer;
   private final List<String> stackTrace;
   private final String regularExpression;
 
@@ -35,9 +35,7 @@
   private static final String CAPTURE_GROUP_PREFIX = "captureGroup";
   private static final int FIRST_CAPTURE_GROUP_INDEX = 0;
 
-  public RetraceRegularExpression(
-      RetracerImpl retracer, List<String> stackTrace, String regularExpression) {
-    this.retracer = retracer;
+  public RetraceRegularExpression(List<String> stackTrace, String regularExpression) {
     this.stackTrace = stackTrace;
     this.regularExpression = regularExpression;
   }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceTypeResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceTypeResultImpl.java
index 0680800..b48d5f3 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceTypeResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceTypeResultImpl.java
@@ -6,20 +6,21 @@
 
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetraceTypeResult;
+import com.android.tools.r8.retrace.Retracer;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 
 public class RetraceTypeResultImpl implements RetraceTypeResult {
 
   private final TypeReference obfuscatedType;
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
-  private RetraceTypeResultImpl(TypeReference obfuscatedType, RetracerImpl retracer) {
+  private RetraceTypeResultImpl(TypeReference obfuscatedType, Retracer retracer) {
     this.obfuscatedType = obfuscatedType;
     this.retracer = retracer;
   }
 
-  static RetraceTypeResultImpl create(TypeReference obfuscatedType, RetracerImpl retracer) {
+  static RetraceTypeResultImpl create(TypeReference obfuscatedType, Retracer retracer) {
     return new RetraceTypeResultImpl(obfuscatedType, 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 46e8ddc..dc96687 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
@@ -10,11 +10,13 @@
 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.RetraceClassResult;
 import com.android.tools.r8.retrace.RetraceClassResult.Element;
 import com.android.tools.r8.retrace.RetraceSourceFileResult;
 import com.android.tools.r8.retrace.RetracedClass;
 import com.android.tools.r8.retrace.RetracedMethod;
 import com.android.tools.r8.retrace.RetracedMethod.KnownRetracedMethod;
+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;
@@ -72,7 +74,7 @@
   }
 
   static RetraceSourceFileResult getSourceFile(
-      Element classElement, RetracedClass context, String sourceFile, RetracerImpl retracer) {
+      Element classElement, RetracedClass context, String sourceFile, Retracer retracer) {
     // If no context is specified always retrace using the found class element.
     if (context == null) {
       return classElement.retraceSourceFile(sourceFile);
@@ -80,8 +82,7 @@
     if (context.equals(classElement.getRetracedClass())) {
       return classElement.retraceSourceFile(sourceFile);
     } else {
-      RetraceClassResultImpl contextClassResult =
-          retracer.retraceClass(context.getClassReference());
+      RetraceClassResult contextClassResult = retracer.retraceClass(context.getClassReference());
       assert !contextClassResult.isAmbiguous();
       if (contextClassResult.hasRetraceResult()) {
         Box<RetraceSourceFileResult> retraceSourceFile = new Box<>();
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassImpl.java
index b2da5d8..47c41b9 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassImpl.java
@@ -4,11 +4,9 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.retrace.RetracedClass;
 
-@Keep
 public final class RetracedClassImpl implements RetracedClass {
 
   private final ClassReference classReference;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldImpl.java
index aee0cde..9dd96c8 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldImpl.java
@@ -4,13 +4,11 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetracedField;
 import java.util.Objects;
 
-@Keep
 public abstract class RetracedFieldImpl implements RetracedField {
 
   private RetracedFieldImpl() {}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodImpl.java
index 1f4ad68..ec4ff42 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodImpl.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetracedMethod;
@@ -14,7 +13,6 @@
 import java.util.Objects;
 import java.util.Optional;
 
-@Keep
 public abstract class RetracedMethodImpl implements RetracedMethod {
 
   private static final int NO_POSITION = -1;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedTypeImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedTypeImpl.java
index d467cc1..38d1a83 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedTypeImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedTypeImpl.java
@@ -4,13 +4,11 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.Keep;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetracedType;
 import java.util.Objects;
 
-@Keep
 public final class RetracedTypeImpl implements RetracedType {
 
   private final TypeReference typeReference;
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 a949fc1..c3453b5 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
@@ -8,11 +8,14 @@
 import com.android.tools.r8.references.TypeReference;
 import com.android.tools.r8.retrace.RetraceClassResult;
 import com.android.tools.r8.retrace.RetraceFieldResult;
+import com.android.tools.r8.retrace.RetraceFrameResult;
 import com.android.tools.r8.retrace.RetraceStackTraceProxy;
+import com.android.tools.r8.retrace.RetraceTypeResult;
 import com.android.tools.r8.retrace.RetracedClass;
 import com.android.tools.r8.retrace.RetracedField;
 import com.android.tools.r8.retrace.RetracedMethod;
 import com.android.tools.r8.retrace.RetracedType;
+import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.retrace.StackTraceElementProxy;
 import com.android.tools.r8.retrace.StackTraceElementProxyRetracer;
 import com.android.tools.r8.utils.Box;
@@ -27,18 +30,18 @@
 public class StackTraceElementProxyRetracerImpl<T extends StackTraceElementProxy<?>>
     implements StackTraceElementProxyRetracer<T> {
 
-  private final RetracerImpl retracer;
+  private final Retracer retracer;
 
-  public StackTraceElementProxyRetracerImpl(RetracerImpl retracer) {
+  public StackTraceElementProxyRetracerImpl(Retracer retracer) {
     this.retracer = retracer;
   }
 
   @Override
-  public Stream<RetraceStackTraceProxyImpl<T>> retrace(T element) {
+  public Stream<RetraceStackTraceProxy<T>> retrace(T element) {
     if (!element.hasClassName()) {
       return Stream.of(RetraceStackTraceProxyImpl.builder(element).build());
     }
-    RetraceClassResultImpl classResult = retracer.retraceClass(element.getClassReference());
+    RetraceClassResult classResult = retracer.retraceClass(element.getClassReference());
     if (element.hasMethodName()) {
       return retraceMethod(element, classResult);
     } else if (element.hasFieldName()) {
@@ -48,7 +51,7 @@
     }
   }
 
-  private Stream<RetraceStackTraceProxyImpl<T>> retraceClassOrType(
+  private Stream<RetraceStackTraceProxy<T>> retraceClassOrType(
       T element, RetraceClassResult classResult) {
     return classResult.stream()
         .flatMap(
@@ -76,15 +79,15 @@
                                     })));
   }
 
-  private Stream<RetraceStackTraceProxyImpl<T>> retraceMethod(
-      T element, RetraceClassResultImpl classResult) {
+  private Stream<RetraceStackTraceProxy<T>> retraceMethod(
+      T element, RetraceClassResult classResult) {
     return retraceFieldOrReturnType(element)
         .flatMap(
             fieldOrReturnTypeConsumer ->
                 retracedMethodArguments(element)
                     .flatMap(
                         argumentsConsumer -> {
-                          RetraceFrameResultImpl frameResult =
+                          RetraceFrameResult frameResult =
                               element.hasLineNumber()
                                   ? classResult.lookupFrame(
                                       element.getMethodName(), element.getLineNumber())
@@ -123,7 +126,7 @@
                         }));
   }
 
-  private Stream<RetraceStackTraceProxyImpl<T>> retraceField(
+  private Stream<RetraceStackTraceProxy<T>> retraceField(
       T element, RetraceClassResult classResult) {
     return retraceFieldOrReturnType(element)
         .flatMap(
@@ -166,7 +169,7 @@
       return Stream.of(proxy -> proxy.setRetracedFieldOrReturnType(RetracedTypeImpl.createVoid()));
     } else {
       TypeReference typeReference = Reference.typeFromTypeName(elementOrReturnType);
-      RetraceTypeResultImpl retraceTypeResult = retracer.retraceType(typeReference);
+      RetraceTypeResult retraceTypeResult = retracer.retraceType(typeReference);
       return retraceTypeResult.stream()
           .map(
               type ->
@@ -184,7 +187,7 @@
     if (!element.hasMethodArguments()) {
       return Stream.of(noEffect -> {});
     }
-    List<RetraceTypeResultImpl> retracedResults =
+    List<RetraceTypeResult> retracedResults =
         Arrays.stream(element.getMethodArguments().split(","))
             .map(typeName -> retracer.retraceType(Reference.typeFromTypeName(typeName)))
             .collect(Collectors.toList());
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementStringProxy.java b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementStringProxy.java
index f649598..5a76e44 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementStringProxy.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementStringProxy.java
@@ -10,11 +10,11 @@
 
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.RetraceStackTraceProxy;
 import com.android.tools.r8.retrace.RetracedClass;
 import com.android.tools.r8.retrace.RetracedField;
 import com.android.tools.r8.retrace.RetracedType;
 import com.android.tools.r8.retrace.StackTraceElementProxy;
-import com.android.tools.r8.retrace.internal.StackTraceElementProxyRetracerImpl.RetraceStackTraceProxyImpl;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
 import com.android.tools.r8.utils.TriFunction;
@@ -136,7 +136,7 @@
   }
 
   public String toRetracedItem(
-      RetraceStackTraceProxyImpl<StackTraceElementStringProxy> retracedProxy,
+      RetraceStackTraceProxy<StackTraceElementStringProxy> retracedProxy,
       boolean printAmbiguous,
       boolean verbose) {
     StringBuilder sb = new StringBuilder();
@@ -334,7 +334,7 @@
     protected final int startIndex;
     protected final int endIndex;
     private final TriFunction<
-            RetraceStackTraceProxyImpl<StackTraceElementStringProxy>,
+            RetraceStackTraceProxy<StackTraceElementStringProxy>,
             StackTraceElementStringProxy,
             Boolean,
             String>
@@ -344,7 +344,7 @@
         int startIndex,
         int endIndex,
         TriFunction<
-                RetraceStackTraceProxyImpl<StackTraceElementStringProxy>,
+                RetraceStackTraceProxy<StackTraceElementStringProxy>,
                 StackTraceElementStringProxy,
                 Boolean,
                 String>
@@ -367,7 +367,7 @@
         int startIndex,
         int endIndex,
         TriFunction<
-                RetraceStackTraceProxyImpl<StackTraceElementStringProxy>,
+                RetraceStackTraceProxy<StackTraceElementStringProxy>,
                 StackTraceElementStringProxy,
                 Boolean,
                 String>
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
index 2b90ffc..3ff24fa 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceFieldTests.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.retrace;
 
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
-import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.retrace.mappings.FieldsWithSameMinifiedNameMapping;
 import com.android.tools.r8.retrace.mappings.MappingForTest;
 import java.util.function.Consumer;
@@ -21,6 +20,6 @@
 
   private void runRetraceTest(MappingForTest mappingForTest, Consumer<Retracer> inspection) {
     inspection.accept(
-        RetracerImpl.create(mappingForTest::mapping, new TestDiagnosticMessagesImpl()));
+        Retracer.createDefault(mappingForTest::mapping, new TestDiagnosticMessagesImpl()));
   }
 }
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 82d3915..458f56c 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.retrace.internal.RetraceAbortException;
-import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.retrace.stacktraces.ActualBotStackTraceBase;
 import com.android.tools.r8.retrace.stacktraces.ActualIdentityStackTrace;
 import com.android.tools.r8.retrace.stacktraces.ActualRetraceBotStackTrace;
@@ -201,9 +200,9 @@
   }
 
   private void inspectRetraceTest(
-      StackTraceForTest stackTraceForTest, Consumer<Retracer> inspection) throws Exception {
+      StackTraceForTest stackTraceForTest, Consumer<Retracer> inspection) {
     inspection.accept(
-        RetracerImpl.create(stackTraceForTest::mapping, new TestDiagnosticMessagesImpl()));
+        Retracer.createDefault(stackTraceForTest::mapping, new TestDiagnosticMessagesImpl()));
   }
 
   private TestDiagnosticMessagesImpl runRetraceTest(StackTraceForTest stackTraceForTest) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index d2518b6..d70775f 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -36,7 +36,6 @@
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.retrace.Retracer;
 import com.android.tools.r8.retrace.internal.DirectClassNameMapperProguardMapProducer;
-import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.BiMapContainer;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -464,7 +463,7 @@
   }
 
   public Retracer retrace() {
-    return RetracerImpl.create(
+    return Retracer.createDefault(
         new InternalProguardMapProducer(
             mapping == null ? ClassNameMapper.builder().build() : mapping),
         new TestDiagnosticMessagesImpl());