[Retrace] Only stream over unique method references
Fixes: 201981983
Change-Id: I6f69211fb5a431bd5999632d2b839ecf1383e443
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
index 54740b7..10ce889 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
@@ -18,8 +18,10 @@
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Pair;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.OptionalInt;
+import java.util.Set;
import java.util.stream.Stream;
public class RetraceMethodResultImpl implements RetraceMethodResult {
@@ -134,17 +136,19 @@
methodDefinition.substituteHolder(
classElement.getRetracedClass().getClassReference()))));
}
- return mappedRanges.stream()
- .map(
- mappedRange -> {
- MethodReference methodReference =
- RetraceUtils.methodReferenceFromMappedRange(
- mappedRange, classElement.getRetracedClass().getClassReference());
- return new ElementImpl(
- this,
- classElement,
- RetracedMethodReferenceImpl.create(methodReference));
- });
+ List<ElementImpl> results = new ArrayList<>();
+ Set<MethodReference> seenMethodReferences = new HashSet<>();
+ for (MappedRange mappedRange : mappedRanges) {
+ MethodReference methodReference =
+ RetraceUtils.methodReferenceFromMappedRange(
+ mappedRange, classElement.getRetracedClass().getClassReference());
+ if (seenMethodReferences.add(methodReference)) {
+ results.add(
+ new ElementImpl(
+ this, classElement, RetracedMethodReferenceImpl.create(methodReference)));
+ }
+ }
+ return results.stream();
});
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java
index 0d0db4c..714719a 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java
@@ -52,16 +52,17 @@
+ someClassRenamed.getTypeName()
+ ":\n"
+ " 1:3:void method2():11:13 -> a\n"
- + " 4:4:void method2():10:10 -> a\n";
+ + " 4:4:void method2():10:10 -> a\n"
+ + " 28:28:void foo.bar.inlinee():92:92 -> a\n"
+ + " 5:5:void method2():14 -> a\n";
@Test
public void testNoLine() {
Retracer retracer =
Retracer.createDefault(
ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {});
- // TODO(b/201981983): Should only give rise to method2 once.
// TODO(b/201982044): Should be the empty set.
- retraceClassMethodAndPosition(retracer, someClassRenamed, someClassOriginal, 2, 2);
+ retraceClassMethodAndPosition(retracer, someClassRenamed, someClassOriginal, 2, 4);
retraceClassMethodAndPosition(retracer, someOtherClassRenamed, someOtherClassOriginal, 1, 1);
}
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 178a0d1..67554d1 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-ccdf1c5f352d7642e50445f39c22ba207945db24
\ No newline at end of file
+ef1d22b8680bd9bc362c017a5641524ffef4d22e
\ No newline at end of file