[Retrace] Fix ambiguous reporting for inline frames

Bug: b/281468612
Change-Id: I1bf7ca7903d1cb60bdd249cb6a2ac45eb4a6b34e
diff --git a/src/main/java/com/android/tools/r8/retrace/StringRetrace.java b/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
index df888dc..3f37a84 100644
--- a/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
+++ b/src/main/java/com/android/tools/r8/retrace/StringRetrace.java
@@ -133,26 +133,33 @@
   private List<String> joinAmbiguousLines(
       List<RetraceStackFrameAmbiguousResult<String>> retracedResult) {
     List<String> result = new ArrayList<>();
-    retracedResult.forEach(
-        potentialResults -> {
-          Set<String> reportedFrames = new HashSet<>();
-          potentialResults.forEachWithIndex(
-              (inlineFrames, index) -> {
-                // Check if we already reported position.
-                String topFrame = inlineFrames.get(0);
-                if (reportedFrames.add(topFrame)) {
-                  inlineFrames.forEach(
-                      inlineFrame -> {
-                        boolean isAmbiguous = index > 0 && topFrame.equals(inlineFrame);
-                        if (isAmbiguous) {
-                          result.add(insertOrIntoStackTraceLine(inlineFrame));
-                        } else {
-                          result.add(inlineFrame);
-                        }
-                      });
-                }
-              });
-        });
+    for (RetraceStackFrameAmbiguousResult<String> ambiguousResult : retracedResult) {
+      boolean addedLines = true;
+      int lineIndex = 0;
+      while (addedLines) {
+        addedLines = false;
+        Set<String> reportedFrames = new HashSet<>();
+        RetraceStackFrameResult<String> firstResult = null;
+        for (RetraceStackFrameResult<String> inlineFrames : ambiguousResult.getAmbiguousResult()) {
+          if (firstResult == null) {
+            firstResult = inlineFrames;
+          }
+          if (lineIndex < inlineFrames.size()) {
+            addedLines = true;
+            String frameToAdd = inlineFrames.get(lineIndex);
+            if (reportedFrames.add(frameToAdd)) {
+              boolean isAmbiguous = inlineFrames != firstResult;
+              if (isAmbiguous) {
+                result.add(insertOrIntoStackTraceLine(frameToAdd));
+              } else {
+                result.add(frameToAdd);
+              }
+            }
+          }
+        }
+        lineIndex += 1;
+      }
+    }
     return result;
   }
 
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousInlineFramesStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousInlineFramesStackTrace.java
index 52b0063..85cb682 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousInlineFramesStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/AmbiguousInlineFramesStackTrace.java
@@ -18,15 +18,10 @@
 
   @Override
   public List<String> retracedStackTrace() {
-    // TODO(b/281468612): Change ambiguous reporting to only report <OR> on the inner most frame.
     return Arrays.asList(
         "com.android.tools.r8.CompilationException:",
         "    at com.android.tools.r8.R8.foo(R8.java:42)",
-        "    at com.android.tools.r8.R8.bar(R8.java:32)",
-        "    at com.android.tools.r8.R8.baz(R8.java:10)",
         "    <OR> at com.android.tools.r8.R8.foo(R8.java:43)",
-        "    at com.android.tools.r8.R8.bar(R8.java:32)",
-        "    at com.android.tools.r8.R8.baz(R8.java:10)",
         "    <OR> at com.android.tools.r8.R8.foo(R8.java:44)",
         "    at com.android.tools.r8.R8.bar(R8.java:32)",
         "    at com.android.tools.r8.R8.baz(R8.java:10)");
@@ -34,15 +29,10 @@
 
   @Override
   public List<String> retraceVerboseStackTrace() {
-    // TODO(b/281468612): Change ambiguous reporting to only report <OR> on the inner most frame.
     return Arrays.asList(
         "com.android.tools.r8.CompilationException:",
         "    at com.android.tools.r8.R8.void foo(int)(R8.java:42)",
-        "    at com.android.tools.r8.R8.void bar(int,int)(R8.java:32)",
-        "    at com.android.tools.r8.R8.void baz(int,int)(R8.java:10)",
         "    <OR> at com.android.tools.r8.R8.void foo(int)(R8.java:43)",
-        "    at com.android.tools.r8.R8.void bar(int,int)(R8.java:32)",
-        "    at com.android.tools.r8.R8.void baz(int,int)(R8.java:10)",
         "    <OR> at com.android.tools.r8.R8.void foo(int)(R8.java:44)",
         "    at com.android.tools.r8.R8.void bar(int,int)(R8.java:32)",
         "    at com.android.tools.r8.R8.void baz(int,int)(R8.java:10)");
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/SingleLineNoLineNumberStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/SingleLineNoLineNumberStackTrace.java
index 914cc4b..a78d417 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/SingleLineNoLineNumberStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/SingleLineNoLineNumberStackTrace.java
@@ -55,12 +55,8 @@
         "\tat com.android.tools.r8.naming.retrace.Main.void main(java.lang.String[])(Main.java:28)",
         "\tat com.android.tools.r8.naming.retrace.Main.void"
             + " method2(java.lang.String)(Main.java:42)",
-        "\tat com.android.tools.r8.naming.retrace.Main.void"
-            + " main2(java.lang.String[])(Main.java:29)",
         "\t<OR> at com.android.tools.r8.naming.retrace.Main.void"
             + " method2(java.lang.String)(Main.java:43)",
-        "\tat com.android.tools.r8.naming.retrace.Main.void"
-            + " main2(java.lang.String[])(Main.java:29)",
         "\t<OR> at com.android.tools.r8.naming.retrace.Main.void"
             + " method2(java.lang.String)(Main.java:44)",
         "\tat com.android.tools.r8.naming.retrace.Main.void"