Remove plain stack trace parser

We are committed to use the regular expression parser thus
testing the plain stack trace parser has no effect.

Change-Id: I9310fbafacbf34976f1aca903a4b9b30f143530a
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 faf8616..63d0098 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,6 @@
 import com.android.tools.r8.Keep;
 import com.android.tools.r8.Version;
 import com.android.tools.r8.retrace.RetraceCommand.Builder;
-import com.android.tools.r8.retrace.internal.PlainStackTraceLineParser;
 import com.android.tools.r8.retrace.internal.RetraceAbortException;
 import com.android.tools.r8.retrace.internal.RetracerImpl;
 import com.android.tools.r8.retrace.internal.StackTraceRegularExpressionParser;
@@ -248,9 +247,7 @@
       timing.begin("Report result");
       StringRetrace stringRetrace =
           new StringRetrace(
-              options.getRegularExpression() == null
-                  ? new PlainStackTraceLineParser()
-                  : new StackTraceRegularExpressionParser(options.getRegularExpression()),
+              new StackTraceRegularExpressionParser(options.getRegularExpression()),
               StackTraceElementProxyRetracer.createDefault(retracer),
               diagnosticsHandler,
               options.isVerbose());
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
index 66819e7..76d6b77 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceCommand.java
@@ -25,10 +25,14 @@
       List<String> stackTrace,
       Consumer<List<String>> retracedStackTraceConsumer,
       boolean isVerbose) {
-    options =
-        new RetraceOptions(regularExpression, diagnosticsHandler, proguardMapProducer, isVerbose);
     this.stackTrace = stackTrace;
     this.retracedStackTraceConsumer = retracedStackTraceConsumer;
+    this.options =
+        RetraceOptions.builder(diagnosticsHandler)
+            .setRegularExpression(regularExpression)
+            .setProguardMapProducer(proguardMapProducer)
+            .setVerbose(isVerbose)
+            .build();
 
     assert this.stackTrace != null;
     assert this.retracedStackTraceConsumer != null;
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java b/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
index 4784f09..47d8c74 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceOptions.java
@@ -21,7 +21,7 @@
   private final DiagnosticsHandler diagnosticsHandler;
   private final ProguardMapProducer proguardMapProducer;
 
-  RetraceOptions(
+  private RetraceOptions(
       String regularExpression,
       DiagnosticsHandler diagnosticsHandler,
       ProguardMapProducer proguardMapProducer,
@@ -112,6 +112,9 @@
       if (this.proguardMapProducer == null) {
         throw new RuntimeException("ProguardMapSupplier not specified");
       }
+      if (this.regularExpression == null) {
+        throw new RuntimeException("Regular expression not specified");
+      }
       return new RetraceOptions(
           regularExpression, diagnosticsHandler, proguardMapProducer, isVerbose);
     }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceLineParser.java b/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceLineParser.java
deleted file mode 100644
index ddaf675..0000000
--- a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceLineParser.java
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// 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;
-
-import static com.android.tools.r8.retrace.internal.RetraceUtils.firstCharFromIndex;
-import static com.android.tools.r8.retrace.internal.RetraceUtils.firstNonWhiteSpaceCharacterFromIndex;
-
-import com.android.tools.r8.retrace.StackTraceLineParser;
-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;
-
-public final class PlainStackTraceLineParser
-    implements StackTraceLineParser<String, StackTraceElementStringProxy> {
-
-  public PlainStackTraceLineParser() {}
-
-  @Override
-  public StackTraceElementStringProxy parse(String stackTraceLine) {
-    return parseLine(stackTraceLine);
-  }
-
-  /**
-   * Captures a stack trace line of the following formats:
-   *
-   * <ul>
-   *   <li>com.android.r8.R8Exception
-   *   <li>com.android.r8.R8Exception: Problem when compiling program
-   *   <li>Caused by: com.android.r8.R8InnerException: You have to write the program first
-   *   <li>com.android.r8.R8InnerException: You have to write the program first
-   * </ul>
-   *
-   * <p>This will also contains false positives, such as
-   *
-   * <pre>
-   *   W( 8207) VFY: unable to resolve static method 11: Lprivateinterfacemethods/I$-CC;....
-   * </pre>
-   *
-   * <p>The only invalid chars for type-identifiers for a java type-name is ';', '[' and '/', so we
-   * cannot really disregard the above line.
-   *
-   * <p>Caused by and Suppressed seems to not change based on locale, so we use these as markers.
-   */
-  private static class ExceptionLine {
-
-    private static final String CAUSED_BY = "Caused by: ";
-    private static final String SUPPRESSED = "Suppressed: ";
-
-    private static StackTraceElementStringProxy tryParse(String line) {
-      if (line.isEmpty()) {
-        return null;
-      }
-      int firstNonWhiteSpaceChar = firstNonWhiteSpaceCharacterFromIndex(line, 0);
-      String description = "";
-      if (line.startsWith(CAUSED_BY, firstNonWhiteSpaceChar)) {
-        description = CAUSED_BY;
-      } else if (line.startsWith(SUPPRESSED, firstNonWhiteSpaceChar)) {
-        description = SUPPRESSED;
-      }
-      int exceptionStartIndex = firstNonWhiteSpaceChar + description.length();
-      int messageStartIndex = firstCharFromIndex(line, exceptionStartIndex, ':');
-      String className = line.substring(exceptionStartIndex, messageStartIndex);
-      if (!DescriptorUtils.isValidJavaType(className)) {
-        return null;
-      }
-      return StackTraceElementStringProxy.builder(line)
-          .registerClassName(exceptionStartIndex, messageStartIndex, ClassNameType.TYPENAME)
-          .build();
-    }
-  }
-
-  /**
-   * Captures a stack trace line on the following form
-   *
-   * <ul>
-   *   <li>at dalvik.system.NativeStart.main(NativeStart.java:99)
-   *   <li>at dalvik.system.NativeStart.main(:99)
-   *   <li>at dalvik.system.NativeStart.main(Foo.java:)
-   *   <li>at dalvik.system.NativeStart.main(Native Method)
-   *   <li>at classloader/named_module@version/foo.bar.baz(:20)
-   *   <li>at classloader//foo.bar.baz(:20)
-   * </ul>
-   *
-   * <p>Empirical evidence suggests that the "at" string is never localized.
-   */
-  private static class AtLine {
-
-    private static StackTraceElementStringProxy tryParse(String line) {
-      // Check that the line is indented with some amount of white space.
-      if (line.length() == 0 || !Character.isWhitespace(line.charAt(0))) {
-        return null;
-      }
-      // Find the first non-white space character and check that we have the sequence 'a', 't', ' '.
-      int firstNonWhiteSpace = firstNonWhiteSpaceCharacterFromIndex(line, 0);
-      if (firstNonWhiteSpace + 2 >= line.length()
-          || line.charAt(firstNonWhiteSpace) != 'a'
-          || line.charAt(firstNonWhiteSpace + 1) != 't'
-          || line.charAt(firstNonWhiteSpace + 2) != ' ') {
-        return null;
-      }
-      int classClassLoaderOrModuleStartIndex =
-          firstNonWhiteSpaceCharacterFromIndex(line, firstNonWhiteSpace + 2);
-      if (classClassLoaderOrModuleStartIndex >= line.length()
-          || classClassLoaderOrModuleStartIndex != firstNonWhiteSpace + 3) {
-        return null;
-      }
-      int parensStart = firstCharFromIndex(line, classClassLoaderOrModuleStartIndex, '(');
-      if (parensStart >= line.length()) {
-        return null;
-      }
-      int parensEnd = line.lastIndexOf(')');
-      if (parensEnd <= parensStart) {
-        return null;
-      }
-      if (firstNonWhiteSpaceCharacterFromIndex(line, parensEnd) == line.length()) {
-        return null;
-      }
-      int methodSeparator = line.lastIndexOf('.', parensStart);
-      if (methodSeparator <= classClassLoaderOrModuleStartIndex) {
-        return null;
-      }
-      int classStartIndex = classClassLoaderOrModuleStartIndex;
-      int classLoaderOrModuleEndIndex =
-          firstCharFromIndex(line, classClassLoaderOrModuleStartIndex, '/');
-      if (classLoaderOrModuleEndIndex < methodSeparator) {
-        int moduleEndIndex = firstCharFromIndex(line, classLoaderOrModuleEndIndex + 1, '/');
-        if (moduleEndIndex < methodSeparator) {
-          // The stack trace contains both a class loader and module
-          classStartIndex = moduleEndIndex + 1;
-        } else {
-          classStartIndex = classLoaderOrModuleEndIndex + 1;
-        }
-      }
-      StackTraceElementStringProxyBuilder builder =
-          StackTraceElementStringProxy.builder(line)
-              .registerClassName(classStartIndex, methodSeparator, ClassNameType.TYPENAME)
-              .registerMethodName(methodSeparator + 1, parensStart);
-      // Check if we have a filename and position.
-      int separatorIndex = line.lastIndexOf(':', parensEnd);
-      if (separatorIndex > -1 && separatorIndex < parensEnd) {
-        builder.registerSourceFile(parensStart + 1, separatorIndex);
-        builder.registerLineNumber(separatorIndex + 1, parensEnd);
-      } else {
-        builder.registerSourceFile(parensStart + 1, parensEnd);
-      }
-      return builder.build();
-    }
-  }
-
-  static class CircularReferenceLine {
-
-    private static final String CIRCULAR_REFERENCE = "[CIRCULAR REFERENCE:";
-
-    static StackTraceElementStringProxy tryParse(String line) {
-      // Check that the line is indented with some amount of white space.
-      if (line.length() == 0 || !Character.isWhitespace(line.charAt(0))) {
-        return null;
-      }
-      // Find the first non-white space character and check that we have the sequence
-      // '[CIRCULAR REFERENCE:Exception]'.
-      int firstNonWhiteSpace = firstNonWhiteSpaceCharacterFromIndex(line, 0);
-      if (!line.startsWith(CIRCULAR_REFERENCE, firstNonWhiteSpace)) {
-        return null;
-      }
-      int exceptionStartIndex = firstNonWhiteSpace + CIRCULAR_REFERENCE.length();
-      int lastBracketPosition = firstCharFromIndex(line, exceptionStartIndex, ']');
-      if (lastBracketPosition == line.length()) {
-        return null;
-      }
-      int onlyWhitespaceFromLastBracket =
-          firstNonWhiteSpaceCharacterFromIndex(line, lastBracketPosition + 1);
-      if (onlyWhitespaceFromLastBracket != line.length()) {
-        return null;
-      }
-      return StackTraceElementStringProxy.builder(line)
-          .registerClassName(exceptionStartIndex, lastBracketPosition, ClassNameType.TYPENAME)
-          .build();
-    }
-  }
-
-  private StackTraceElementStringProxy parseLine(String line) {
-    // Most lines are 'at lines' so attempt to parse it first.
-    StackTraceElementStringProxy parsedLine = AtLine.tryParse(line);
-    if (parsedLine != null) {
-      return parsedLine;
-    }
-    parsedLine = ExceptionLine.tryParse(line);
-    if (parsedLine != null) {
-      return parsedLine;
-    }
-    parsedLine = CircularReferenceLine.tryParse(line);
-    if (parsedLine != null) {
-      return parsedLine;
-    }
-    return StackTraceElementStringProxy.builder(line).build();
-  }
-}
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 d7a13c8..220bea7 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -4,12 +4,10 @@
 
 package com.android.tools.r8.retrace;
 
-import static com.android.tools.r8.retrace.internal.StackTraceRegularExpressionParser.DEFAULT_REGULAR_EXPRESSION;
 import static junit.framework.TestCase.assertEquals;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
 import com.android.tools.r8.TestBase;
@@ -61,7 +59,6 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.function.Consumer;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -70,19 +67,16 @@
 @RunWith(Parameterized.class)
 public class RetraceTests extends TestBase {
 
-  @Parameters(name = "{0}, use regular expression: {1}, external: {2}")
+  @Parameters(name = "{0}, external: {1}")
   public static Collection<Object[]> data() {
-    return buildParameters(
-        getTestParameters().withCfRuntimes().build(), BooleanUtils.values(), BooleanUtils.values());
+    return buildParameters(getTestParameters().withCfRuntimes().build(), BooleanUtils.values());
   }
 
   private final TestParameters testParameters;
-  private final boolean useRegExpParsing;
   private final boolean external;
 
-  public RetraceTests(TestParameters parameters, boolean useRegExpParsing, boolean external) {
+  public RetraceTests(TestParameters parameters, boolean external) {
     this.testParameters = parameters;
-    this.useRegExpParsing = useRegExpParsing;
     this.external = external;
   }
 
@@ -154,8 +148,7 @@
     List<ActualBotStackTraceBase> stackTraces =
         ImmutableList.of(new ActualIdentityStackTrace(), new ActualRetraceBotStackTrace());
     for (ActualBotStackTraceBase stackTrace : stackTraces) {
-      runRetraceTest(stackTrace)
-          .assertWarningsCount(useRegExpParsing ? 0 : stackTrace.expectedWarnings());
+      runRetraceTest(stackTrace).assertNoWarnings();
     }
   }
 
@@ -193,7 +186,7 @@
   public void testCircularReferenceStackTrace() throws Exception {
     // Proguard retrace (and therefore the default regular expression) will not retrace circular
     // reference exceptions.
-    assumeFalse(useRegExpParsing);
+    assumeTrue("b/178599214", false);
     runRetraceTest(new CircularReferenceStackTrace());
   }
 
@@ -203,9 +196,8 @@
   }
 
   @Test
-  @Ignore("b/170293908")
   public void testBootLoaderAndNamedModulesStackTrace() throws Exception {
-    assumeFalse(useRegExpParsing);
+    assumeTrue("b/170293908", false);
     runRetraceTest(new NamedModuleStackTrace());
   }
 
@@ -287,7 +279,6 @@
   private TestDiagnosticMessagesImpl runRetraceTest(
       StackTraceForTest stackTraceForTest, boolean allowExperimentalMapping) throws Exception {
     if (external) {
-      assumeTrue(useRegExpParsing);
       assumeTrue(testParameters.isCfRuntime());
       // The external dependency is built on top of R8Lib. If test.py is run with
       // no r8lib, do not try and run the external R8 Retrace since it has not been built.
@@ -327,7 +318,6 @@
           RetraceCommand.builder(diagnosticsHandler)
               .setProguardMapProducer(ProguardMapProducer.fromString(stackTraceForTest.mapping()))
               .setStackTrace(stackTraceForTest.obfuscatedStackTrace())
-              .setRegularExpression(useRegExpParsing ? DEFAULT_REGULAR_EXPRESSION : null)
               .setRetracedStackTraceConsumer(
                   retraced ->
                       assertEquals(