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(