[Retrace] Only narrow retrace result if having valid position
Change-Id: I927d83456e6531b50761666c59d2a67adde68327
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
index 89e7c9d..c63a707 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
@@ -421,29 +421,29 @@
List<StackTraceLine> lines,
String classLoaderName) {
ClassReference classReference = Reference.classFromTypeName(clazz);
- retraceBase
- .retrace(classReference)
- .lookupMethod(method)
- .narrowByLine(linePosition)
- .forEach(
- methodElement -> {
- MethodReference methodReference = methodElement.getMethodReference();
- lines.add(
- new AtLine(
- startingWhitespace,
- at,
- classLoaderName,
- moduleName,
- methodReference.getHolderClass().getTypeName(),
- methodReference.getMethodName(),
- methodDescriptionFromMethodReference(methodReference, verbose),
- retraceBase.retraceSourceFile(
- classReference, fileName, methodReference.getHolderClass(), true),
- hasLinePosition()
- ? methodElement.getOriginalLineNumber(linePosition)
- : linePosition,
- methodElement.getRetraceMethodResult().isAmbiguous()));
- });
+ RetraceMethodResult retraceResult = retraceBase.retrace(classReference).lookupMethod(method);
+ if (linePosition != NO_POSITION && linePosition != INVALID_POSITION) {
+ retraceResult = retraceResult.narrowByLine(linePosition);
+ }
+ retraceResult.forEach(
+ methodElement -> {
+ MethodReference methodReference = methodElement.getMethodReference();
+ lines.add(
+ new AtLine(
+ startingWhitespace,
+ at,
+ classLoaderName,
+ moduleName,
+ methodReference.getHolderClass().getTypeName(),
+ methodReference.getMethodName(),
+ methodDescriptionFromMethodReference(methodReference, verbose),
+ retraceBase.retraceSourceFile(
+ classReference, fileName, methodReference.getHolderClass(), true),
+ hasLinePosition()
+ ? methodElement.getOriginalLineNumber(linePosition)
+ : linePosition,
+ methodElement.getRetraceMethodResult().isAmbiguous()));
+ });
}
@Override
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 174dd5e..47dc5c3 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -32,6 +32,7 @@
import com.android.tools.r8.retrace.stacktraces.RetraceAssertionErrorStackTrace;
import com.android.tools.r8.retrace.stacktraces.StackTraceForTest;
import com.android.tools.r8.retrace.stacktraces.SuppressedStackTrace;
+import com.android.tools.r8.retrace.stacktraces.UnknownSourceStackTrace;
import com.android.tools.r8.utils.BooleanUtils;
import com.google.common.collect.ImmutableList;
import java.util.Collection;
@@ -172,6 +173,11 @@
runRetraceTest(new NamedModuleStackTrace());
}
+ @Test
+ public void testUnknownSourceStackTrace() {
+ runRetraceTest(new UnknownSourceStackTrace());
+ }
+
private TestDiagnosticMessagesImpl runRetraceTest(StackTraceForTest stackTraceForTest) {
TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
RetraceCommand retraceCommand =
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/UnknownSourceStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/UnknownSourceStackTrace.java
new file mode 100644
index 0000000..4219979
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/UnknownSourceStackTrace.java
@@ -0,0 +1,50 @@
+// Copyright (c) 2020, 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.stacktraces;
+
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Arrays;
+import java.util.List;
+
+public class UnknownSourceStackTrace implements StackTraceForTest {
+
+ @Override
+ public List<String> obfuscatedStackTrace() {
+ return Arrays.asList(
+ "com.android.tools.r8.CompilationException: foo[parens](Source:3)",
+ " at a.a.a(Unknown Source)",
+ " at a.a.a(Unknown Source)",
+ " at com.android.tools.r8.R8.main(Unknown Source)",
+ "Caused by: com.android.tools.r8.CompilationException: foo[parens](Source:3)",
+ " at a.a.a(Unknown Source)",
+ " ... 42 more");
+ }
+
+ @Override
+ public List<String> retracedStackTrace() {
+ return Arrays.asList(
+ "com.android.tools.r8.CompilationException: foo[parens](Source:3)",
+ " at com.android.tools.r8.R8.bar(R8.java)",
+ " <OR> at com.android.tools.r8.R8.foo(R8.java)",
+ " at com.android.tools.r8.R8.bar(R8.java)",
+ " <OR> at com.android.tools.r8.R8.foo(R8.java)",
+ " at com.android.tools.r8.R8.main(R8.java)",
+ "Caused by: com.android.tools.r8.CompilationException: foo[parens](Source:3)",
+ " at com.android.tools.r8.R8.bar(R8.java)",
+ " <OR> at com.android.tools.r8.R8.foo(R8.java)",
+ " ... 42 more");
+ }
+
+ @Override
+ public String mapping() {
+ return StringUtils.lines(
+ "com.android.tools.r8.R8 -> a.a:", " void foo(int) -> a", " void bar(int, int) -> a");
+ }
+
+ @Override
+ public int expectedWarnings() {
+ return 0;
+ }
+}