Fix EnqueuerMockitoAnalysis

- EnqueuerMockitoAnalysis needs subtyping info hence the
  enqueuer cannot unset it.

Change-Id: Iab3b0b7f4ac7bba92a33d2283fe159ca66646067
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 15a2384..6244efe 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -4859,17 +4859,14 @@
     CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring, liveMethods::contains)
         .postProcessingDesugaring(liveTypes.items, eventConsumer, executorService, timing);
 
-    if (syntheticAdditions.isEmpty()) {
+    if (syntheticAdditions.isEmpty() && !options.testing.forceEnqueuerFullProcessingDesugaring) {
       return;
     }
 
     // Commit the pending synthetics and recompute subtypes.
     appInfo = appInfo.rebuildWithClassHierarchy(app -> app);
     appView.setAppInfo(appInfo);
-
-    // Unset the subtyping info since it has been invalidated. We currently never use it after the
-    // the post processing desugaring.
-    subtypingInfo = null;
+    subtypingInfo = timing.time("Create SubtypingInfo", () -> SubtypingInfo.create(appView));
 
     syntheticAdditions.enqueueWorkItems(this);
 
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index dd600b2..8e9d3f1 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2209,6 +2209,8 @@
 
     public boolean forceInvokeRangeForInvokeCustom = false;
 
+    public boolean forceEnqueuerFullProcessingDesugaring = false;
+
     public boolean forceThrowInConvert =
         System.getProperty("com.android.tools.r8.testing.forceThrowInConvert") != null;
 
diff --git a/src/test/java/com/android/tools/r8/shaking/reflection/MockitoTest.java b/src/test/java/com/android/tools/r8/shaking/reflection/MockitoTest.java
index 40d5be0..b2a3f64 100644
--- a/src/test/java/com/android/tools/r8/shaking/reflection/MockitoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/reflection/MockitoTest.java
@@ -13,15 +13,17 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.shaking.reflection.MockitoTest.Helpers.ShouldNotBeMergedImpl;
 import com.android.tools.r8.shaking.reflection.MockitoTest.Helpers.SpyImpl1;
 import com.android.tools.r8.shaking.reflection.MockitoTest.Helpers.SpyImpl2;
 import com.android.tools.r8.shaking.reflection.MockitoTest.Helpers.SpyInterface;
+import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.List;
+import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -35,9 +37,13 @@
   @Parameter(0)
   public TestParameters parameters;
 
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withDefaultRuntimes().withMaximumApiLevel().build();
+  @Parameter(1)
+  public boolean forceEnqueuerFullProcessingDesugaring;
+
+  @Parameters(name = "{0}, force: {1}")
+  public static Collection<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
   }
 
   private static final List<String> EXPECTED_OUTPUT =
@@ -215,6 +221,7 @@
 
   @Test
   public void testRuntime() throws Exception {
+    Assume.assumeTrue("Avoid double processing", forceEnqueuerFullProcessingDesugaring);
     byte[] mockitoClassBytes = rewriteMockito();
     testForRuntime(parameters)
         .addProgramClassesAndInnerClasses(Helpers.class)
@@ -230,6 +237,10 @@
     byte[] mockitoClassBytes = rewriteMockito();
     testForR8(parameters.getBackend())
         .setMinApi(parameters)
+        .addOptionsModification(
+            opt ->
+                opt.testing.forceEnqueuerFullProcessingDesugaring =
+                    forceEnqueuerFullProcessingDesugaring)
         .addProgramClassesAndInnerClasses(Helpers.class)
         .addProgramClassFileData(rewriteTestMain())
         .addClasspathClassFileData(mockitoClassBytes)
@@ -259,9 +270,10 @@
                     if (!className.endsWith("TestMain") && !className.endsWith("Impl")) {
                       assertThat(clazz.getOriginalTypeName(), clazz, not(isFinal()));
                       // No mocked methods should be finalized.
-                      clazz.forAllMethods(method -> {
-                        assertThat(method, not(isFinal()));
-                      });
+                      clazz.forAllMethods(
+                          method -> {
+                            assertThat(method, not(isFinal()));
+                          });
                     }
                   });
             })