Do not mark synthesized methods on global stubs as synthetic
Fixed: b/268464983
Change-Id: Ifeaffba6cb2933fdab83935cc223fd6eecfd1178
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index 7f67d3d..b4ec7c9 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -210,9 +210,13 @@
OneShotCollectionConsumer<MappingInformation> methodSpecificMappingInformation =
OneShotCollectionConsumer.wrap(new ArrayList<>());
- if (method.getDefinition().isD8R8Synthesized()
- || (!mappedPositions.isEmpty()
- && mappedPositions.get(0).getPosition().isD8R8Synthesized())) {
+ // We only do global synthetic classes when using names from the library. For such classes it
+ // is important that we do not filter out stack frames since they could appear from concrete
+ // classes in the library. Additionally, this is one place where it is helpful for developers
+ // to also get reported synthesized frames since stubbing can change control-flow and
+ // exceptions.
+ if (isD8R8Synthesized(method, mappedPositions)
+ && !appView.getSyntheticItems().isGlobalSyntheticClass(method.getHolder())) {
methodSpecificMappingInformation.add(CompilerSynthesizedMappingInformation.getInstance());
}
@@ -369,6 +373,12 @@
return this;
}
+ private boolean isD8R8Synthesized(ProgramMethod method, List<MappedPosition> mappedPositions) {
+ return method.getDefinition().isD8R8Synthesized()
+ || (!mappedPositions.isEmpty()
+ && mappedPositions.get(0).getPosition().isD8R8Synthesized());
+ }
+
private MethodReference computeMappedMethod(DexMethod current, AppView<?> appView) {
NamingLens namingLens = appView.getNamingLens();
DexMethod renamedMethodSignature =
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockRetraceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockRetraceTest.java
index d478236..edd4d27 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockRetraceTest.java
@@ -7,7 +7,6 @@
import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass;
import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat;
import static com.android.tools.r8.naming.retrace.StackTrace.containsLine;
-import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.SingleTestRunResult;
@@ -90,14 +89,8 @@
.assertFailureWithErrorThatThrows(ExceptionInInitializerError.class)
.assertFailureWithErrorThatThrows(ArithmeticException.class),
result -> result.assertFailureWithErrorThatThrows(NoClassDefFoundError.class))
- // TODO(b/268464983): The stack trace should always contain the line.
.inspectStackTrace(
- stackTrace ->
- assertThat(
- stackTrace,
- notIf(
- containsLine(clinitFrame, equivalence),
- parameters.getApiLevel().isLessThan(mockLevel))));
+ stackTrace -> assertThat(stackTrace, containsLine(clinitFrame, equivalence)));
}
}