[Retrace] Allow all characters in source file not colliding with line

Bug: 176851728
Change-Id: I6e57710125c6d398f5274b29168b286dce38dbca
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java b/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
index 9272f58..a632f1c 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/PlainStackTraceVisitor.java
@@ -123,8 +123,8 @@
       if (parensStart >= line.length()) {
         return null;
       }
-      int parensEnd = firstCharFromIndex(line, parensStart, ')');
-      if (parensEnd >= line.length()) {
+      int parensEnd = line.lastIndexOf(')');
+      if (parensEnd <= parensStart) {
         return null;
       }
       if (firstNonWhiteSpaceCharacterFromIndex(line, parensEnd) == line.length()) {
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
index fb79984..5790d52 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceRegularExpression.java
@@ -276,10 +276,10 @@
 
     @Override
     String subExpression() {
-      String anyNonDigitSourceFileChar = anyNonDigitLetterCharWithMarkers + "_ \\.";
-      String anyChar = anyNonDigitSourceFileChar + anyDigit;
-      String colonWithNonDigitSuffix = ":[" + anyNonDigitSourceFileChar + ":" + "]";
-      return "((?:(?:(?:" + colonWithNonDigitSuffix + "))|(?:[" + anyChar + "]))+)?";
+      String anyNonDigitNonColonChar = "^\\d:";
+      String anyNonColonChar = "^:";
+      String colonWithNonDigitSuffix = ":+[" + anyNonDigitNonColonChar + "]";
+      return "((?:(?:(?:" + colonWithNonDigitSuffix + "))|(?:[" + anyNonColonChar + "]))+)?";
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
index cd3e12d..02166f9 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceUtils.java
@@ -116,7 +116,7 @@
     if (newFileName.endsWith("Kt") && (extension.isEmpty() || extension.equals("kt"))) {
       newFileName = newFileName.substring(0, newFileName.length() - 2);
       extension = "kt";
-    } else if (extension.isEmpty()) {
+    } else if (!extension.equals("kt")) {
       extension = "java";
     }
     return newFileName + "." + extension;
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceRegularExpressionTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceRegularExpressionTests.java
index 878a91d..4f79193 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceRegularExpressionTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceRegularExpressionTests.java
@@ -297,7 +297,7 @@
 
           @Override
           public List<String> retracedStackTrace() {
-            return Collections.singletonList("foo.Bar$Baz.baz(Bar.dummy)");
+            return Collections.singletonList("foo.Bar$Baz.baz(Bar.java)");
           }
 
           @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 e8e09aa..34d4b0f 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.retrace.stacktraces.AmbiguousStackTrace;
 import com.android.tools.r8.retrace.stacktraces.AmbiguousWithMultipleLineMappingsStackTrace;
 import com.android.tools.r8.retrace.stacktraces.AmbiguousWithSignatureNonVerboseStackTrace;
+import com.android.tools.r8.retrace.stacktraces.AutoStackTrace;
 import com.android.tools.r8.retrace.stacktraces.CircularReferenceStackTrace;
 import com.android.tools.r8.retrace.stacktraces.ColonInFileNameStackTrace;
 import com.android.tools.r8.retrace.stacktraces.FileNameExtensionStackTrace;
@@ -235,6 +236,11 @@
     runRetraceTest(new SourceFileNameSynthesizeStackTrace());
   }
 
+  @Test
+  public void testAutoStackTrace() {
+    runRetraceTest(new AutoStackTrace());
+  }
+
   private void inspectRetraceTest(
       StackTraceForTest stackTraceForTest, Consumer<Retracer> inspection) {
     inspection.accept(
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/AutoStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/AutoStackTrace.java
new file mode 100644
index 0000000..0504b58
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/AutoStackTrace.java
@@ -0,0 +1,41 @@
+// Copyright (c) 2021, 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 com.google.common.collect.ImmutableList;
+import java.util.List;
+
+public class AutoStackTrace implements StackTraceForTest {
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    return ImmutableList.of(
+        "java.io.IOException: INVALID_SENDER",
+        "\tat qtr.a(:com.google.android.gms@203915081@20.39.15 (060808-335085812):46)",
+        "\tat qtr.a(:com.google.android.gms@203915081@20.39.15 (060808-335085812):18)");
+  }
+
+  @Override
+  public String mapping() {
+    return StringUtils.lines(
+        "com.android.tools.r8.AutoTest -> qtr:",
+        "  46:46:void foo(int):200:200 -> a",
+        "  17:19:void foo(int,int):23:25 -> a");
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    return ImmutableList.of(
+        "java.io.IOException: INVALID_SENDER",
+        "\tat com.android.tools.r8.AutoTest.foo(AutoTest.java:200)",
+        "\tat com.android.tools.r8.AutoTest.foo(AutoTest.java:24)");
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 0;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/FileNameExtensionStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/FileNameExtensionStackTrace.java
index ae9e0ff..dc77ca6 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/FileNameExtensionStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/FileNameExtensionStackTrace.java
@@ -41,7 +41,7 @@
         "    at R8.main(Native Method)",
         "    at R8.main(R8.java:)",
         "    at R8.main(R8.kt:1)",
-        "    at R8.main(R8.foo)",
+        "    at R8.main(R8.java)",
         "    at R8.main(R8.java)",
         "    at R8.main(R8.java)",
         "    at R8.main(R8.java)",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameStackTrace.java
index 65f9824..ebc23a1 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameStackTrace.java
@@ -21,10 +21,10 @@
   public List<String> retracedStackTrace() {
     return Arrays.asList(
         "Exception in thread \"main\" java.lang.NullPointerException",
-        "\tat foo.Bar$Baz.baz(Bar.dummy:0)",
-        "\tat Foo$Bar.bar(Foo.dummy:2)",
-        "\tat com.android.tools.r8.naming.retrace.Main$Foo.method1(Main.dummy:8)",
-        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.dummy:7)");
+        "\tat foo.Bar$Baz.baz(Bar.java:0)",
+        "\tat Foo$Bar.bar(Foo.java:2)",
+        "\tat com.android.tools.r8.naming.retrace.Main$Foo.method1(Main.java:8)",
+        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.java:7)");
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameWithInnerClassesStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameWithInnerClassesStackTrace.java
index 20ed6ec..8d7551a 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameWithInnerClassesStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineFileNameWithInnerClassesStackTrace.java
@@ -21,8 +21,8 @@
   public List<String> retracedStackTrace() {
     return Arrays.asList(
         "Exception in thread \"main\" java.lang.NullPointerException",
-        "\tat foo.Bar$Baz$Qux.baz(Bar.dummy:0)",
-        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.dummy:7)");
+        "\tat foo.Bar$Baz$Qux.baz(Bar.java:0)",
+        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.java:7)");
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/NoObfuscationRangeMappingWithStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/NoObfuscationRangeMappingWithStackTrace.java
index 4057a91..3f944e2 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/NoObfuscationRangeMappingWithStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/NoObfuscationRangeMappingWithStackTrace.java
@@ -24,10 +24,10 @@
   public List<String> retracedStackTrace() {
     return Arrays.asList(
         "Exception in thread \"main\" java.lang.NullPointerException",
-        "\tat com.android.tools.r8.naming.retrace.Main.foo(Main.dummy:1)",
-        "\tat com.android.tools.r8.naming.retrace.Main.bar(Main.dummy:3)",
-        "\tat com.android.tools.r8.naming.retrace.Main.baz(Main.dummy:8)",
-        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.dummy:7)");
+        "\tat com.android.tools.r8.naming.retrace.Main.foo(Main.java:1)",
+        "\tat com.android.tools.r8.naming.retrace.Main.bar(Main.java:3)",
+        "\tat com.android.tools.r8.naming.retrace.Main.baz(Main.java:8)",
+        "\tat com.android.tools.r8.naming.retrace.Main.main(Main.java:7)");
   }
 
   @Override