[Retrace] Add a builder for constructing Retrace object

Bug: b/201666766
Change-Id: I4fef2616eb220f8b1c8ad41c63c18f5e0f3e24f1
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 a3cf547..aebad6d 100644
--- a/src/main/java/com/android/tools/r8/retrace/Retrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.Version;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.references.TypeReference;
-import com.android.tools.r8.retrace.RetraceCommand.Builder;
 import com.android.tools.r8.retrace.internal.ResultWithContextImpl;
 import com.android.tools.r8.retrace.internal.RetraceAbortException;
 import com.android.tools.r8.retrace.internal.StackTraceElementStringProxy;
@@ -64,9 +63,10 @@
               + "[--regex <regexp>, --verbose, --info, --quiet, --verify-mapping-file-hash]",
           "  where <proguard-map> is an r8 generated mapping file.");
 
-  private static Builder parseArguments(String[] args, DiagnosticsHandler diagnosticsHandler) {
+  private static RetraceCommand.Builder parseArguments(
+      String[] args, DiagnosticsHandler diagnosticsHandler) {
     ParseContext context = new ParseContext(args);
-    Builder builder = RetraceCommand.builder(diagnosticsHandler);
+    RetraceCommand.Builder builder = RetraceCommand.builder(diagnosticsHandler);
     boolean hasSetProguardMap = false;
     boolean hasSetStackTrace = false;
     boolean hasSetQuiet = false;
@@ -430,7 +430,7 @@
   }
 
   private static void run(String[] args, DiagnosticsHandler diagnosticsHandler) {
-    Builder builder = parseArguments(args, diagnosticsHandler);
+    RetraceCommand.Builder builder = parseArguments(args, diagnosticsHandler);
     if (builder == null) {
       // --help or --version was an argument to list
       if (Arrays.asList(args).contains("--version")) {
@@ -491,6 +491,48 @@
     }
   }
 
+  public static <T, ST extends StackTraceElementProxy<T, ST>> Builder<T, ST> builder() {
+    return new Builder<>();
+  }
+
+  @Keep
+  public static class Builder<T, ST extends StackTraceElementProxy<T, ST>> {
+
+    private StackTraceLineParser<T, ST> stackTraceLineParser;
+    private StackTraceElementProxyRetracer<T, ST> proxyRetracer;
+    private DiagnosticsHandler diagnosticsHandler;
+    protected boolean isVerbose;
+
+    public Builder<T, ST> setStackTraceLineParser(
+        StackTraceLineParser<T, ST> stackTraceLineParser) {
+      this.stackTraceLineParser = stackTraceLineParser;
+      return this;
+    }
+
+    public Builder<T, ST> setRetracer(Retracer retracer) {
+      return setProxyRetracer(StackTraceElementProxyRetracer.createDefault(retracer));
+    }
+
+    public Builder<T, ST> setProxyRetracer(StackTraceElementProxyRetracer<T, ST> proxyRetracer) {
+      this.proxyRetracer = proxyRetracer;
+      return this;
+    }
+
+    public Builder<T, ST> setDiagnosticsHandler(DiagnosticsHandler diagnosticsHandler) {
+      this.diagnosticsHandler = diagnosticsHandler;
+      return this;
+    }
+
+    public Builder<T, ST> setVerbose(boolean isVerbose) {
+      this.isVerbose = isVerbose;
+      return this;
+    }
+
+    public Retrace<T, ST> build() {
+      return new Retrace<>(stackTraceLineParser, proxyRetracer, diagnosticsHandler, isVerbose);
+    }
+  }
+
   private static class RetraceDiagnosticsHandler implements DiagnosticsHandler {
 
     private final DiagnosticsHandler diagnosticsHandler;