[Retrace] Move synthesizing of filename out of retrace api
Change-Id: I2408be18e0d0a521594db3b9bbe841b35113edee
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceClassElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceClassElement.java
index 8fdf47d..0615725 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceClassElement.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceClassElement.java
@@ -12,7 +12,7 @@
RetracedClassReference getRetracedClass();
- RetraceSourceFileResult retraceSourceFile(String sourceFile);
+ RetraceSourceFileResult getSourceFile();
RetraceFieldResult lookupField(String fieldName);
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceFieldElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceFieldElement.java
index ec8dfb9..5982550 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceFieldElement.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceFieldElement.java
@@ -14,5 +14,5 @@
RetraceClassElement getClassElement();
- RetraceSourceFileResult retraceSourceFile(String sourceFile);
+ RetraceSourceFileResult getSourceFile();
}
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
index 5d8332e..3295c44 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceFrameElement.java
@@ -20,7 +20,7 @@
void visitNonCompilerSynthesizedFrames(BiConsumer<RetracedMethodReference, Integer> consumer);
- RetraceSourceFileResult retraceSourceFile(RetracedClassMemberReference frame, String sourceFile);
+ RetraceSourceFileResult getSourceFile(RetracedClassMemberReference frame);
List<? extends RetracedMethodReference> getOuterFrames();
}
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceMethodElement.java b/src/main/java/com/android/tools/r8/retrace/RetraceMethodElement.java
index d4eb53b..887bff5 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceMethodElement.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceMethodElement.java
@@ -14,5 +14,5 @@
RetraceClassElement getClassElement();
- RetraceSourceFileResult retraceSourceFile(String sourceFile);
+ RetraceSourceFileResult getSourceFile();
}
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
index 1e04b54..9941d9c 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceSourceFileResult.java
@@ -10,7 +10,7 @@
@Keep
public interface RetraceSourceFileResult {
- boolean isInferred();
+ boolean hasRetraceResult();
String getFilename();
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
index cfc923a..5dace5b 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.retrace.internal;
-import static com.android.tools.r8.retrace.internal.RetraceUtils.synthesizeFileName;
import com.android.tools.r8.naming.ClassNamingForNameMapper;
import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
@@ -17,6 +16,7 @@
import com.android.tools.r8.retrace.RetraceClassElement;
import com.android.tools.r8.retrace.RetraceClassResult;
import com.android.tools.r8.retrace.RetraceFrameResult;
+import com.android.tools.r8.retrace.RetraceSourceFileResult;
import com.android.tools.r8.retrace.Retracer;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Pair;
@@ -239,6 +239,18 @@
}
@Override
+ public RetraceSourceFileResult getSourceFile() {
+ if (classResult.mapper != null) {
+ for (MappingInformation info : classResult.mapper.getAdditionalMappingInfo()) {
+ if (info.isFileNameInformation()) {
+ return new RetraceSourceFileResultImpl(info.asFileNameInformation().getFileName());
+ }
+ }
+ }
+ return new RetraceSourceFileResultImpl(null);
+ }
+
+ @Override
public RetraceClassResultImpl getRetraceResultContext() {
return classResult;
}
@@ -256,25 +268,6 @@
}
@Override
- public RetraceSourceFileResultImpl retraceSourceFile(String sourceFile) {
- if (classResult.mapper != null) {
- for (MappingInformation info : classResult.mapper.getAdditionalMappingInfo()) {
- if (info.isFileNameInformation()) {
- return new RetraceSourceFileResultImpl(
- info.asFileNameInformation().getFileName(), false);
- }
- }
- }
- return new RetraceSourceFileResultImpl(
- synthesizeFileName(
- classReference.getTypeName(),
- classResult.obfuscatedReference.getTypeName(),
- sourceFile,
- mapper != null),
- true);
- }
-
- @Override
public RetraceFieldResultImpl lookupField(String fieldName) {
return lookupField(FieldDefinition.create(classReference.getClassReference(), fieldName));
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
index 331298e..6f5e557 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
@@ -133,9 +133,8 @@
}
@Override
- public RetraceSourceFileResult retraceSourceFile(String sourceFile) {
- return RetraceUtils.getSourceFile(
- classElement, fieldReference.getHolderClass(), sourceFile, retraceFieldResult.retracer);
+ public RetraceSourceFileResult getSourceFile() {
+ return classElement.getSourceFile();
}
}
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
index b5dae19..82717b1 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
@@ -216,10 +216,9 @@
}
@Override
- public RetraceSourceFileResult retraceSourceFile(
- RetracedClassMemberReference frame, String sourceFile) {
- return RetraceUtils.getSourceFile(
- classElement, frame.getHolderClass(), sourceFile, retraceFrameResult.retracer);
+ public RetraceSourceFileResult getSourceFile(RetracedClassMemberReference frame) {
+ return RetraceUtils.getSourceFileOrLookup(
+ frame.getHolderClass(), classElement, retraceFrameResult.retracer);
}
@Override
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 735a163..37b8ffa 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
@@ -166,10 +166,9 @@
}
@Override
- public com.android.tools.r8.retrace.RetraceSourceFileResult retraceSourceFile(
- String sourceFile) {
- return RetraceUtils.getSourceFile(
- classElement, methodReference.getHolderClass(), sourceFile, retraceMethodResult.retracer);
+ public com.android.tools.r8.retrace.RetraceSourceFileResult getSourceFile() {
+ return RetraceUtils.getSourceFileOrLookup(
+ methodReference.getHolderClass(), classElement, retraceMethodResult.retracer);
}
}
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
index 7595d69..d3753e3 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceSourceFileResultImpl.java
@@ -9,16 +9,14 @@
public class RetraceSourceFileResultImpl implements RetraceSourceFileResult {
private final String filename;
- private final boolean synthesized;
- RetraceSourceFileResultImpl(String filename, boolean synthesized) {
+ RetraceSourceFileResultImpl(String filename) {
this.filename = filename;
- this.synthesized = synthesized;
}
@Override
- public boolean isInferred() {
- return synthesized;
+ public boolean hasRetraceResult() {
+ return filename != null;
}
@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 38a8c47..d1a6b10 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
@@ -75,42 +75,19 @@
return clazz.substring(lastIndexOfPeriod + 1, endIndex);
}
- static RetraceSourceFileResult getSourceFile(
- RetraceClassElement classElement,
- RetracedClassReference context,
- String sourceFile,
- Retracer retracer) {
- // If no context is specified always retrace using the found class element.
- if (context == null) {
- return classElement.retraceSourceFile(sourceFile);
+ public static RetraceSourceFileResult getSourceFileOrLookup(
+ RetracedClassReference holder, RetraceClassElement context, Retracer retracer) {
+ if (holder.equals(context.getRetracedClass())) {
+ return context.getSourceFile();
}
- if (context.equals(classElement.getRetracedClass())) {
- return classElement.retraceSourceFile(sourceFile);
- } else {
- RetraceClassResult contextClassResult = retracer.retraceClass(context.getClassReference());
- assert !contextClassResult.isAmbiguous();
- if (contextClassResult.hasRetraceResult()) {
- Box<RetraceSourceFileResult> retraceSourceFile = new Box<>();
- contextClassResult.forEach(
- element -> retraceSourceFile.set(element.retraceSourceFile(sourceFile)));
- return retraceSourceFile.get();
- } else {
- return new RetraceSourceFileResultImpl(
- synthesizeFileName(
- context.getTypeName(),
- classElement.getRetracedClass().getTypeName(),
- sourceFile,
- true),
- true);
- }
- }
+ RetraceClassResult contextClassResult = retracer.retraceClass(holder.getClassReference());
+ Box<RetraceSourceFileResult> retraceSourceFile = new Box<>();
+ contextClassResult.forEach(element -> retraceSourceFile.set(element.getSourceFile()));
+ return retraceSourceFile.get();
}
- public static String synthesizeFileName(
- String retracedClassName,
- String minifiedClassName,
- String sourceFile,
- boolean hasRetraceResult) {
+ public static String inferFileName(
+ String retracedClassName, String sourceFile, boolean hasRetraceResult) {
if (!hasRetraceResult || KEEP_SOURCEFILE_NAMES.contains(sourceFile)) {
return sourceFile;
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
index 793282a..acaad20 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceElementProxyRetracerImpl.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.retrace.RetraceClassResult;
import com.android.tools.r8.retrace.RetraceFieldResult;
import com.android.tools.r8.retrace.RetraceFrameResult;
+import com.android.tools.r8.retrace.RetraceSourceFileResult;
import com.android.tools.r8.retrace.RetraceStackTraceProxy;
import com.android.tools.r8.retrace.RetraceTypeResult;
import com.android.tools.r8.retrace.RetracedClassReference;
@@ -24,6 +25,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -73,9 +75,11 @@
fieldOrReturnTypeConsumer.accept(proxy);
if (element.hasFileName()) {
proxy.setSourceFile(
- classElement
- .retraceSourceFile(element.getFileName())
- .getFilename());
+ getSourceFile(
+ classElement::getSourceFile,
+ classElement.getRetracedClass(),
+ element.getFileName(),
+ classResult.hasRetraceResult()));
}
return proxy.build();
})));
@@ -116,9 +120,11 @@
}
if (element.hasFileName()) {
proxy.setSourceFile(
- frameElement
- .retraceSourceFile(frame, element.getFileName())
- .getFilename());
+ getSourceFile(
+ () -> frameElement.getSourceFile(frame),
+ frame.getHolderClass(),
+ element.getFileName(),
+ classResult.hasRetraceResult()));
}
fieldOrReturnTypeConsumer.accept(proxy);
argumentsConsumer.accept(proxy);
@@ -151,9 +157,11 @@
.setTopFrame(true);
if (element.hasFileName()) {
proxy.setSourceFile(
- fieldElement
- .retraceSourceFile(element.getFileName())
- .getFilename());
+ getSourceFile(
+ fieldElement::getSourceFile,
+ fieldElement.getField().getHolderClass(),
+ element.getFileName(),
+ classResult.hasRetraceResult()));
}
fieldOrReturnTypeConsumer.accept(proxy);
argumentsConsumer.accept(proxy);
@@ -162,6 +170,17 @@
}));
}
+ private String getSourceFile(
+ Supplier<RetraceSourceFileResult> sourceFile,
+ RetracedClassReference classReference,
+ String fileName,
+ boolean hasRetraceResult) {
+ RetraceSourceFileResult sourceFileResult = sourceFile.get();
+ return sourceFileResult.hasRetraceResult()
+ ? sourceFileResult.getFilename()
+ : RetraceUtils.inferFileName(classReference.getTypeName(), fileName, hasRetraceResult);
+ }
+
private Stream<Consumer<RetraceStackTraceProxyImpl.Builder<T, ST>>> retraceFieldOrReturnType(
ST element) {
if (!element.hasFieldOrReturnType()) {
diff --git a/src/test/java/com/android/tools/r8/retrace/SourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/SourceFileTest.java
index 9e2b2df..30dc206 100644
--- a/src/test/java/com/android/tools/r8/retrace/SourceFileTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/SourceFileTest.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.retrace.internal.RetraceUtils;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.util.function.BiConsumer;
import org.junit.Test;
@@ -61,7 +62,7 @@
inspector
.clazz(ClassWithCustomFileName.class)
.retraceUnique()
- .retraceSourceFile("nofile.java")
+ .getSourceFile()
.getFilename());
}));
}
@@ -73,13 +74,12 @@
((stackTrace, inspector) -> {
// Since the type has a mapping, the file is inferred from the class name.
assertEquals("SourceFileTest.java", stackTrace.getStackTraceLines().get(0).fileName);
+ RetraceClassElement retraceClassElement =
+ inspector.clazz(ClassWithoutCustomFileName.class).retraceUnique();
assertEquals(
"SourceFileTest.java",
- inspector
- .clazz(ClassWithoutCustomFileName.class)
- .retraceUnique()
- .retraceSourceFile("nofile.java")
- .getFilename());
+ RetraceUtils.inferFileName(
+ retraceClassElement.getRetracedClass().getTypeName(), "nofile.java", true));
}));
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java
index e35be6f..829969d 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInferSourceFileTest.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.retrace.api;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.TestParameters;
@@ -43,10 +43,9 @@
List<RetraceSourceFileResult> sourceFileResults = new ArrayList<>();
Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
.retraceClass(Reference.classFromTypeName("a"))
- .forEach(clazz -> sourceFileResults.add(clazz.retraceSourceFile("")));
+ .forEach(clazz -> sourceFileResults.add(clazz.getSourceFile()));
assertEquals(1, sourceFileResults.size());
- assertTrue(sourceFileResults.get(0).isInferred());
- assertEquals("Class.java", sourceFileResults.get(0).getFilename());
+ assertFalse(sourceFileResults.get(0).hasRetraceResult());
}
}
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileNotFoundTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileNotFoundTest.java
new file mode 100644
index 0000000..1a64f1e
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileNotFoundTest.java
@@ -0,0 +1,51 @@
+// 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.api;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceSourceFileResult;
+import com.android.tools.r8.retrace.Retracer;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RetraceApiSourceFileNotFoundTest extends RetraceApiTestBase {
+
+ public RetraceApiSourceFileNotFoundTest(TestParameters parameters) {
+ super(parameters);
+ }
+
+ @Override
+ protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
+ return ApiTest.class;
+ }
+
+ public static class ApiTest implements RetraceApiBinaryTest {
+
+ private final String mapping =
+ "some.Class -> a:\n"
+ + " 1:3:int strawberry(int):99:101 -> s\n"
+ + " 4:5:int mango(float):121:122 -> s\n";
+
+ @Test
+ public void testRetracingSourceFile() {
+ List<RetraceSourceFileResult> sourceFileResults = new ArrayList<>();
+ Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
+ .retraceClass(Reference.classFromTypeName("a"))
+ .forEach(clazz -> sourceFileResults.add(clazz.getSourceFile()));
+ assertEquals(1, sourceFileResults.size());
+ assertNull(sourceFileResults.get(0));
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java
index f75ea42..f94e0e4 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSourceFileTest.java
@@ -5,7 +5,7 @@
package com.android.tools.r8.retrace.api;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.TestParameters;
@@ -44,9 +44,9 @@
List<RetraceSourceFileResult> sourceFileResults = new ArrayList<>();
Retracer.createDefault(ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {})
.retraceClass(Reference.classFromTypeName("a"))
- .forEach(clazz -> sourceFileResults.add(clazz.retraceSourceFile("")));
+ .forEach(clazz -> sourceFileResults.add(clazz.getSourceFile()));
assertEquals(1, sourceFileResults.size());
- assertFalse(sourceFileResults.get(0).isInferred());
+ assertTrue(sourceFileResults.get(0).hasRetraceResult());
assertEquals("SomeFileName.kt", sourceFileResults.get(0).getFilename());
}
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
index 7fad751..e73ce25 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestHelper.java
@@ -37,6 +37,7 @@
ImmutableList.of(
RetraceApiEmptyTest.RetraceTest.class,
RetraceApiSourceFileTest.ApiTest.class,
+ RetraceApiSourceFileNotFoundTest.ApiTest.class,
RetraceApiInferSourceFileTest.ApiTest.class,
RetraceApiSynthesizedClassTest.ApiTest.class,
RetraceApiSynthesizedFieldTest.ApiTest.class,
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 826dbae..df5562e 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-bd5d0c9d87504c31d996be84ba3379838027acf6
\ No newline at end of file
+b1210b61a8a801a78b4e424c484937d0b5902586
\ No newline at end of file