[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"