[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;
+  }
+}