Fix DesugarLambdaRetraceTest for older VMs

Bug: 117815862
Change-Id: I268783b250b1966680998597da55915e34f69bdd
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
index fa0a393..1868940 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/DesugarLambdaRetraceTest.java
@@ -63,7 +63,9 @@
             // Check the frame from the lambda class.
             StackTrace lambdaFrames = retracedStackTrace.filter(this::isSynthesizedLambdaFrame);
             assertEquals(1, lambdaFrames.size());
-            assertEquals(mode == CompilationMode.RELEASE ? 0 : 2, lambdaFrames.get(0).lineNumber);
+            if (lambdaFrames.get(0).hasLineNumber()) {
+              assertEquals(mode == CompilationMode.RELEASE ? 0 : 2, lambdaFrames.get(0).lineNumber);
+            }
             // Proguard retrace will take the class name until the first $ to construct the file
             // name, so for "-$$Lambda$...", the file name becomes "-.java".
             assertEquals("-.java", lambdaFrames.get(0).fileName);
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
index 13115f4..9876c95 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -45,6 +45,10 @@
       this.lineNumber = lineNumber;
     }
 
+    public boolean hasLineNumber() {
+      return lineNumber >= 0;
+    }
+
     public static StackTraceLine parse(String line) {
       String originalLine = line;
 
@@ -53,7 +57,7 @@
         line = line.substring(AT_PREFIX.length());
       }
 
-      // Expect only one '(', and only one ')' with a ':' in between.
+      // Expect only one '(', and only one ')' with an optional ':' in between.
       int parenBeginIndex = line.indexOf('(');
       assertTrue(parenBeginIndex > 0);
       assertEquals(parenBeginIndex, line.lastIndexOf('('));
@@ -61,15 +65,17 @@
       assertTrue(parenBeginIndex < parenEndIndex);
       assertEquals(parenEndIndex, line.lastIndexOf(')'));
       int colonIndex = line.indexOf(':');
-      assertTrue(parenBeginIndex < colonIndex && colonIndex < parenEndIndex);
+      assertTrue(colonIndex == -1 || (parenBeginIndex < colonIndex && colonIndex < parenEndIndex));
       assertEquals(parenEndIndex, line.lastIndexOf(')'));
       String classAndMethod = line.substring(0, parenBeginIndex);
       int lastDotIndex = classAndMethod.lastIndexOf('.');
       assertTrue(lastDotIndex > 0);
       String className = classAndMethod.substring(0, lastDotIndex);
-      String methodName = classAndMethod.substring(lastDotIndex + 1, classAndMethod.length());
-      String fileName = line.substring(parenBeginIndex + 1, colonIndex);
-      int lineNumber = Integer.parseInt(line.substring(colonIndex + 1, parenEndIndex));
+      String methodName = classAndMethod.substring(lastDotIndex + 1);
+      int fileNameEnd = colonIndex > 0 ? colonIndex : parenEndIndex;
+      String fileName = line.substring(parenBeginIndex + 1, fileNameEnd);
+      int lineNumber =
+          colonIndex > 0 ? Integer.parseInt(line.substring(colonIndex + 1, parenEndIndex)) : -1;
       StackTraceLine result =
           new StackTraceLine(originalLine, className, methodName, fileName, lineNumber);
       assertEquals(line, result.toString());
@@ -101,7 +107,8 @@
 
     @Override
     public String toString() {
-      return className + '.' + methodName + '(' + fileName + ':' + lineNumber + ')';
+      String lineNumberPart = lineNumber >= 0 ? ":" + lineNumber : "";
+      return className + '.' + methodName + '(' + fileName + lineNumberPart + ')';
     }
   }