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