[Retrace] Add getter for RetracedSourceFile on proxy
Change-Id: I4546db5453510dbb18b2312e96943aedff505dfc
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java b/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
index 7f4747a..714e2b9 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetraceStackTraceElementProxy.java
@@ -43,6 +43,8 @@
String getSourceFile();
+ RetracedSourceFile getRetracedSourceFile();
+
int getLineNumber();
RetraceStackTraceContext getContext();
diff --git a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
index 5e6b29b..2c030f7 100644
--- a/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
+++ b/src/main/java/com/android/tools/r8/retrace/RetracedClassReference.java
@@ -10,6 +10,10 @@
@Keep
public interface RetracedClassReference {
+ boolean isUnknown();
+
+ boolean isKnown();
+
String getTypeName();
String getDescriptor();
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 dc90e36..98ed799 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
@@ -212,9 +212,8 @@
return new RetraceClassElementImpl(
this,
RetracedClassReferenceImpl.create(
- mapper == null
- ? obfuscatedReference
- : Reference.classFromTypeName(mapper.originalName)),
+ mapper == null ? obfuscatedReference : Reference.classFromTypeName(mapper.originalName),
+ mapper != null),
mapper);
}
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 afade35..e405443 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
@@ -64,7 +64,8 @@
? RetracedClassReferenceImpl.create(
Reference.classFromDescriptor(
DescriptorUtils.javaTypeToDescriptor(
- fieldSignature.toHolderFromQualified())))
+ fieldSignature.toHolderFromQualified())),
+ true)
: classElement.getRetracedClass();
return new ElementImpl(
this,
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
index e5d0df2..e3d5dc2 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceThrownExceptionResultImpl.java
@@ -43,9 +43,8 @@
return new RetraceThrownExceptionElementImpl(
this,
RetracedClassReferenceImpl.create(
- mapper == null
- ? obfuscatedReference
- : Reference.classFromTypeName(mapper.originalName)),
+ mapper == null ? obfuscatedReference : Reference.classFromTypeName(mapper.originalName),
+ mapper != null),
mapper,
obfuscatedReference);
}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
index d036009..326b157 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedClassReferenceImpl.java
@@ -10,14 +10,27 @@
public final class RetracedClassReferenceImpl implements RetracedClassReference {
private final ClassReference classReference;
+ private final boolean hasResult;
- private RetracedClassReferenceImpl(ClassReference classReference) {
+ private RetracedClassReferenceImpl(ClassReference classReference, boolean hasResult) {
assert classReference != null;
this.classReference = classReference;
+ this.hasResult = hasResult;
}
- public static RetracedClassReferenceImpl create(ClassReference classReference) {
- return new RetracedClassReferenceImpl(classReference);
+ public static RetracedClassReferenceImpl create(
+ ClassReference classReference, boolean hasResult) {
+ return new RetracedClassReferenceImpl(classReference, hasResult);
+ }
+
+ @Override
+ public boolean isUnknown() {
+ return !isKnown();
+ }
+
+ @Override
+ public boolean isKnown() {
+ return hasResult;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
index 8316a3b..304462e 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedFieldReferenceImpl.java
@@ -49,7 +49,7 @@
@Override
public RetracedClassReferenceImpl getHolderClass() {
- return RetracedClassReferenceImpl.create(fieldReference.getHolderClass());
+ return RetracedClassReferenceImpl.create(fieldReference.getHolderClass(), true);
}
@Override
@@ -95,7 +95,7 @@
@Override
public RetracedClassReferenceImpl getHolderClass() {
- return RetracedClassReferenceImpl.create(fieldDefinition.getHolderClass());
+ return RetracedClassReferenceImpl.create(fieldDefinition.getHolderClass(), false);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
index f896692..8d7d20f 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetracedMethodReferenceImpl.java
@@ -99,7 +99,7 @@
@Override
public RetracedClassReferenceImpl getHolderClass() {
- return RetracedClassReferenceImpl.create(methodReference.getHolderClass());
+ return RetracedClassReferenceImpl.create(methodReference.getHolderClass(), true);
}
@Override
@@ -153,7 +153,7 @@
@Override
public RetracedClassReferenceImpl getHolderClass() {
- return RetracedClassReferenceImpl.create(methodDefinition.getHolderClass());
+ return RetracedClassReferenceImpl.create(methodDefinition.getHolderClass(), false);
}
@Override
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 c907105..86e9046 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
@@ -103,11 +103,7 @@
.joinAmbiguous(classResult.isAmbiguous())
.setTopFrame(true)
.setContext(thrownExceptionElement.getContext())
- .apply(
- setSourceFileOnProxy(
- thrownExceptionElement::getSourceFile,
- thrownExceptionElement.getRetracedClass(),
- classResult))
+ .apply(setSourceFileOnProxy(thrownExceptionElement::getSourceFile))
.build();
}
@@ -143,11 +139,7 @@
.applyIf(
element.hasLineNumber(),
b -> b.setLineNumber(element.getLineNumber()))
- .apply(
- setSourceFileOnProxy(
- classElement::getSourceFile,
- classElement.getRetracedClass(),
- classResult))
+ .apply(setSourceFileOnProxy(classElement::getSourceFile))
.build());
}
return frameResult.stream()
@@ -160,7 +152,6 @@
singleFrame ->
buildProxyForRewrittenFrameElement(
element,
- classResult,
proxy,
frameResult,
frameElement,
@@ -172,7 +163,6 @@
private RetraceStackTraceElementProxyImpl<T, ST> buildProxyForRewrittenFrameElement(
ST element,
- RetraceClassResult classResult,
RetraceStackTraceElementProxyImpl<T, ST> proxy,
RetraceFrameResult frameResult,
RetraceFrameElement frameElement,
@@ -188,12 +178,9 @@
.setContext(frameElement.getRetraceStackTraceContext())
.applyIf(
element.hasLineNumber(),
- builder -> {
- builder.setLineNumber(method.getOriginalPositionOrDefault(element.getLineNumber()));
- })
- .apply(
- setSourceFileOnProxy(
- () -> frameElement.getSourceFile(method), method.getHolderClass(), classResult))
+ builder ->
+ builder.setLineNumber(method.getOriginalPositionOrDefault(element.getLineNumber())))
+ .apply(setSourceFileOnProxy(() -> frameElement.getSourceFile(method)))
.build();
}
@@ -213,13 +200,12 @@
.map(
fieldElement ->
buildProxyForRewrittenFieldElement(
- classResult, proxy, retraceFieldResult, fieldElement));
+ proxy, retraceFieldResult, fieldElement));
}))
.build();
}
private RetraceStackTraceElementProxyImpl<T, ST> buildProxyForRewrittenFieldElement(
- RetraceClassResult classResult,
RetraceStackTraceElementProxyImpl<T, ST> proxy,
RetraceFieldResult retraceFieldResult,
RetraceFieldElement fieldElement) {
@@ -229,27 +215,18 @@
.setRetracedField(fieldElement.getField())
.joinAmbiguous(retraceFieldResult.isAmbiguous())
.setTopFrame(true)
- .apply(
- setSourceFileOnProxy(
- fieldElement::getSourceFile, fieldElement.getField().getHolderClass(), classResult))
+ .apply(setSourceFileOnProxy(fieldElement::getSourceFile))
.build();
}
private Consumer<RetraceStackTraceElementProxyImpl.Builder<T, ST>> setSourceFileOnProxy(
- Supplier<RetracedSourceFile> sourceFile,
- RetracedClassReference classReference,
- RetraceClassResult classResult) {
+ Supplier<RetracedSourceFile> sourceFile) {
return proxy -> {
ST original = proxy.originalElement;
if (!original.hasSourceFile()) {
return;
}
- RetracedSourceFile retracedSourceFile = sourceFile.get();
- proxy.setSourceFile(
- retracedSourceFile.hasRetraceResult()
- ? retracedSourceFile.getSourceFile()
- : RetraceUtils.inferSourceFile(
- classReference.getTypeName(), original.getSourceFile(), classResult.isEmpty()));
+ proxy.setSourceFile(sourceFile.get());
};
}
@@ -351,7 +328,7 @@
private final RetracedFieldReference retracedField;
private final RetracedTypeReference fieldOrReturnType;
private final List<RetracedTypeReference> methodArguments;
- private final String sourceFile;
+ private final RetracedSourceFile sourceFile;
private final int lineNumber;
private final boolean isAmbiguous;
private final boolean isTopFrame;
@@ -364,7 +341,7 @@
RetracedFieldReference retracedField,
RetracedTypeReference fieldOrReturnType,
List<RetracedTypeReference> methodArguments,
- String sourceFile,
+ RetracedSourceFile sourceFile,
int lineNumber,
boolean isAmbiguous,
boolean isTopFrame,
@@ -460,6 +437,17 @@
@Override
public String getSourceFile() {
+ if (sourceFile != null && sourceFile.hasRetraceResult()) {
+ return sourceFile.getSourceFile();
+ }
+ String originalSourceFile =
+ originalItem.getSourceFile() == null ? "" : originalItem.getSourceFile();
+ return RetraceUtils.inferSourceFile(
+ retracedClass.getTypeName(), originalSourceFile, retracedClass.isKnown());
+ }
+
+ @Override
+ public RetracedSourceFile getRetracedSourceFile() {
return sourceFile;
}
@@ -549,7 +537,7 @@
private RetracedFieldReference retracedField;
private RetracedTypeReference fieldOrReturnType;
private List<RetracedTypeReference> methodArguments;
- private String sourceFile;
+ private RetracedSourceFile sourceFile;
private int lineNumber = -1;
private boolean isAmbiguous;
private boolean isTopFrame;
@@ -584,7 +572,8 @@
return this;
}
- private Builder<T, ST> setSourceFile(String sourceFile) {
+ private Builder<T, ST> setSourceFile(RetracedSourceFile sourceFile) {
+ assert sourceFile != null;
this.sourceFile = sourceFile;
return this;
}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
index 7744c14..889f0d9 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiProxyFrameWithSourceFileTest.java
@@ -50,7 +50,7 @@
.getResult()
.get(0)
.get(0);
- assertEquals("com.android.tools.R8.a(Unknown Source)", stringRetraceStackFrameResult.get(0));
+ assertEquals("com.android.tools.R8.a(R8.java)", stringRetraceStackFrameResult.get(0));
}
public static class TestProxy extends StackTraceElementProxy<String, TestProxy> {
@@ -133,7 +133,7 @@
+ "."
+ getMethodName()
+ "("
- + retracedProxy.getSourceFile()
+ + retracedProxy.getRetracedSourceFile().getOrInferSourceFile()
+ ")";
}
}