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)));
     }
   }