Revert "Desugaring of AutoCloseable#close everywhere"
This reverts commit e75138225da0c74741f467e59f7526c95d3ad80f.
Reason for revert: Bot failures
Change-Id: I309f652d3b5924175851f02783cfb0f79dfc9eba
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index e442567..dd8e727 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPICallbackSynthesizer;
@@ -13,10 +12,8 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterPostProcessor;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import com.android.tools.r8.ir.desugar.records.RecordClassDesugaring;
-import com.android.tools.r8.utils.CollectionUtils;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -68,7 +65,7 @@
&& !appView.options().getLibraryDesugaringOptions().isDesugaredLibraryCompilation()) {
desugarings.add(new DesugaredLibraryRetargeterPostProcessor(appView));
}
- if (appView.options().shouldDesugarAutoCloseable()) {
+ if (appView.options().testing.enableAutoCloseableDesugaring) {
desugarings.add(new AutoCloseableRetargeterPostProcessor(appView));
}
if (interfaceMethodProcessorFacade != null) {
@@ -104,10 +101,8 @@
CfPostProcessingDesugaringEventConsumer eventConsumer,
ExecutorService executorService)
throws ExecutionException {
- Collection<DexProgramClass> sortedProgramClasses =
- CollectionUtils.sort(programClasses, Comparator.comparing(DexClass::getType));
for (CfPostProcessingDesugaring desugaring : desugarings) {
- desugaring.postProcessingDesugaring(sortedProgramClasses, eventConsumer, executorService);
+ desugaring.postProcessingDesugaring(programClasses, eventConsumer, executorService);
}
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
index 4fb43cf..b45317b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterPostProcessor.java
@@ -47,12 +47,18 @@
Collection<DexProgramClass> programClasses,
CfPostProcessingDesugaringEventConsumer eventConsumer,
ExecutorService executorService) {
+ ensureInterfacesAndForwardingMethodsSynthesized(programClasses, eventConsumer);
+ }
+
+ @SuppressWarnings("ReferenceEquality")
+ private void ensureInterfacesAndForwardingMethodsSynthesized(
+ Collection<DexProgramClass> programClasses,
+ AutoCloseableRetargeterPostProcessingEventConsumer eventConsumer) {
ProcessorContext processorContext = appView.createProcessorContext();
MainThreadContext mainThreadContext = processorContext.createMainThreadContext();
for (DexProgramClass clazz : programClasses) {
if (clazz.superType == null) {
- assert clazz.type.isIdenticalTo(appView.dexItemFactory().objectType)
- : clazz.type.toSourceString();
+ assert clazz.type == appView.dexItemFactory().objectType : clazz.type.toSourceString();
continue;
}
if (implementsAutoCloseableAtLibraryBoundary(clazz)) {
@@ -65,51 +71,46 @@
if (clazz.interfaces.contains(appView.dexItemFactory().autoCloseableType)) {
return true;
}
- WorkList<DexClass> workList = collectLibrarySuperTypeAndInterfaces(clazz);
+ WorkList<DexType> workList = collectLibrarySuperTypeAndInterfaces(clazz);
return libraryTypesImplementsAutoCloseable(workList, clazz);
}
- private WorkList<DexClass> collectLibrarySuperTypeAndInterfaces(DexProgramClass clazz) {
- WorkList<DexClass> workList = WorkList.newIdentityWorkList();
+ private WorkList<DexType> collectLibrarySuperTypeAndInterfaces(DexProgramClass clazz) {
+ WorkList<DexType> workList = WorkList.newIdentityWorkList();
DexClass superclass = appView.definitionFor(clazz.superType);
// Only performs computation if superclass is a library class, but not object to filter out
// the most common case.
if (superclass != null
&& superclass.isLibraryClass()
&& !superclass.type.isIdenticalTo(appView.dexItemFactory().objectType)) {
- workList.addIfNotSeen(superclass);
+ workList.addIfNotSeen(superclass.type);
}
for (DexType itf : clazz.interfaces) {
DexClass superItf = appView.definitionFor(itf);
if (superItf != null) {
- workList.addIfNotSeen(superItf);
+ workList.addIfNotSeen(superItf.type);
}
}
return workList;
}
private boolean libraryTypesImplementsAutoCloseable(
- WorkList<DexClass> workList, DexProgramClass clazz) {
+ WorkList<DexType> workList, DexProgramClass clazz) {
while (workList.hasNext()) {
- DexClass current = workList.next();
- if (current.getType().isIdenticalTo(appView.dexItemFactory().objectType)) {
+ DexType current = workList.next();
+ if (current.isIdenticalTo(appView.dexItemFactory().objectType)) {
continue;
}
- if (current.interfaces.contains(appView.dexItemFactory().autoCloseableType)) {
+ DexClass currentClass = appView.definitionFor(current);
+ if (currentClass == null) {
+ reportInvalidSupertype(current, clazz);
+ continue;
+ }
+ if (currentClass.interfaces.contains(appView.dexItemFactory().autoCloseableType)) {
return true;
}
- DexClass superClass = appView.definitionFor(current.superType);
- if (superClass == null) {
- reportInvalidSupertype(current.superType, clazz);
- } else {
- workList.addIfNotSeen(superClass);
- }
- for (DexType itf : current.interfaces) {
- DexClass superItf = appView.definitionFor(itf);
- if (superItf != null) {
- workList.addIfNotSeen(superItf);
- }
- }
+ workList.addIfNotSeen(currentClass.superType);
+ workList.addIfNotSeen(currentClass.interfaces);
}
return false;
}
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
index 7f80f81..2604cef 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/EmulateDispatchSyntheticCfCodeProvider.java
@@ -123,17 +123,9 @@
assert dispatchType == AUTO_CLOSEABLE;
instructions.add(new CfCheckCast(method.holder));
loadExtraParameters(instructions);
- // The type method.getHolderType() may not resolve if compiled without android library, for
- // example, with the jdk as android.jar.
- if (method
- .getHolderType()
- .isIdenticalTo(appView.dexItemFactory().javaUtilConcurrentExecutorServiceType)) {
- assert appView.definitionFor(method.getHolderType()) == null
- || appView.definitionFor(method.getHolderType()).isInterface();
+ if (appView.definitionFor(method.getHolderType()).isInterface()) {
instructions.add(new CfInvoke(Opcodes.INVOKEINTERFACE, method, true));
} else {
- assert appView.definitionFor(method.getHolderType()) == null
- || !appView.definitionFor(method.getHolderType()).isInterface();
instructions.add(new CfInvoke(Opcodes.INVOKEVIRTUAL, method, false));
}
}
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 ad5986b..f26afb8 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -2129,7 +2129,7 @@
System.getProperty("com.android.tools.r8.enableKeepAnnotations") != null;
public boolean reverseClassSortingForDeterminism = false;
- public boolean enableAutoCloseableDesugaring = true;
+ public boolean enableAutoCloseableDesugaring = false;
public boolean enableNumberUnboxer = false;
public boolean printNumberUnboxed = false;
public boolean roundtripThroughLir = false;
@@ -2710,7 +2710,8 @@
public boolean shouldDesugarAutoCloseable() {
return desugarState.isOn()
&& getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K)
- && canHaveMissingImplementsAutoCloseableInterface();
+ && canHaveMissingImplementsAutoCloseableInterface()
+ && testing.enableAutoCloseableDesugaring;
}
public boolean isSwitchRewritingEnabled() {
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTest.java
index eed8542..ad0d144 100644
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTest.java
+++ b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTest.java
@@ -8,16 +8,17 @@
import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
+import com.android.tools.r8.D8TestBuilder;
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.ContentProviderClientApiLevel24;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.DrmManagerClientApiLevel24;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.MediaMetadataRetrieverApiLevel29;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.TypedArrayAndroidApiLevel31;
+import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.ContentProviderClient;
+import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.DrmManagerClient;
+import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.MediaMetadataRetriever;
+import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.TypedArray;
import com.android.tools.r8.desugar.backports.AbstractBackportTest;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -81,6 +82,11 @@
}
@Override
+ protected void configureD8Options(D8TestBuilder d8TestBuilder) throws IOException {
+ d8TestBuilder.addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true);
+ }
+
+ @Override
protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
super.configureProgram(builder);
if (builder.isJvmTestBuilder()) {
@@ -147,22 +153,22 @@
private static byte[] getTestRunner() throws IOException {
return transformer(TestRunner.class)
.replaceClassDescriptorInMethodInstructions(
- descriptor(ContentProviderClientApiLevel24.class),
+ descriptor(ContentProviderClient.class),
DexItemFactory.androidContentContentProviderClientDescriptorString)
.replaceClassDescriptorInMethodInstructions(
- descriptor(DrmManagerClientApiLevel24.class),
+ descriptor(DrmManagerClient.class),
DexItemFactory.androidDrmDrmManagerClientDescriptorString)
.replaceClassDescriptorInMethodInstructions(
- descriptor(MediaMetadataRetrieverApiLevel29.class),
+ descriptor(MediaMetadataRetriever.class),
DexItemFactory.androidMediaMediaMetadataRetrieverDescriptorString)
.replaceClassDescriptorInMethodInstructions(
- descriptor(TypedArrayAndroidApiLevel31.class),
+ descriptor(TypedArray.class),
DexItemFactory.androidContentResTypedArrayDescriptorString)
.clearNest()
.transform();
}
- public static class ContentProviderClientOverride extends ContentProviderClientApiLevel24 {
+ public static class ContentProviderClientOverride extends ContentProviderClient {
public void close() {
super.close();
@@ -170,9 +176,9 @@
}
}
- public static class ContentProviderClientSub extends ContentProviderClientApiLevel24 {}
+ public static class ContentProviderClientSub extends ContentProviderClient {}
- public static class DrmManagerClientOverride extends DrmManagerClientApiLevel24 {
+ public static class DrmManagerClientOverride extends DrmManagerClient {
public void close() {
super.close();
@@ -180,9 +186,9 @@
}
}
- public static class DrmManagerClientSub extends DrmManagerClientApiLevel24 {}
+ public static class DrmManagerClientSub extends DrmManagerClient {}
- public static class MediaMetadataRetrieverOverride extends MediaMetadataRetrieverApiLevel29 {
+ public static class MediaMetadataRetrieverOverride extends MediaMetadataRetriever {
public void close() {
super.close();
@@ -190,9 +196,9 @@
}
}
- public static class MediaMetadataRetrieverSub extends MediaMetadataRetrieverApiLevel29 {}
+ public static class MediaMetadataRetrieverSub extends MediaMetadataRetriever {}
- public static class TypedArrayOverride extends TypedArrayAndroidApiLevel31 {
+ public static class TypedArrayOverride extends TypedArray {
public void close() {
super.close();
@@ -200,7 +206,7 @@
}
}
- public static class TypedArraySub extends TypedArrayAndroidApiLevel31 {}
+ public static class TypedArraySub extends TypedArray {}
public static class TestRunner extends MiniAssert {
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTwrTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTwrTest.java
index c6b4632..efad24f 100644
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTwrTest.java
+++ b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidSubtypeTwrTest.java
@@ -8,11 +8,11 @@
import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
+import com.android.tools.r8.D8TestBuilder;
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.ContentProviderClientApiLevel24;
import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.DrmManagerClientApiLevel24;
@@ -36,7 +36,6 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters()
- .withCfRuntime(CfVm.JDK21)
.withDexRuntimes()
.withApiLevelsStartingAtIncluding(AndroidApiLevel.K)
.enableApiLevelsForCf()
@@ -83,6 +82,11 @@
}
@Override
+ protected void configureD8Options(D8TestBuilder d8TestBuilder) throws IOException {
+ d8TestBuilder.addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true);
+ }
+
+ @Override
protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
super.configureProgram(builder);
if (builder.isJvmTestBuilder()) {
@@ -317,5 +321,10 @@
}
MiniAssert.assertTrue(box2[0].wasClosed);
}
+
+ // Forwards to MiniAssert to avoid having to make it public.
+ public static void doFail(String message) {
+ MiniAssert.fail(message);
+ }
}
}
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidTest.java
index 885be86..5668685 100644
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidTest.java
+++ b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterAndroidTest.java
@@ -8,6 +8,7 @@
import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
+import com.android.tools.r8.D8TestBuilder;
import com.android.tools.r8.D8TestCompileResult;
import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
@@ -53,6 +54,12 @@
registerTarget(AndroidApiLevel.B, 5);
}
+ @Override
+ protected void configureD8Options(D8TestBuilder d8TestBuilder) throws IOException {
+ d8TestBuilder.addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true);
+ }
+
+ @Override
protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
super.configureProgram(builder);
if (builder.isJvmTestBuilder()) {
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTest.java
index d303fe3..d9c567c 100644
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTest.java
+++ b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTest.java
@@ -66,6 +66,7 @@
assumeTrue(parameters.isDexRuntime());
testForD8(parameters.getBackend())
.addInnerClassesAndStrippedOuter(getClass())
+ .addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true)
.setMinApi(parameters)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
.addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
@@ -103,6 +104,7 @@
.addKeepMainRule(Main.class)
.addInnerClassesAndStrippedOuter(getClass())
.addInliningAnnotations()
+ .addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true)
.setMinApi(parameters)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
.addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTwrTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTwrTest.java
deleted file mode 100644
index 5a41819..0000000
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceSubtypeTwrTest.java
+++ /dev/null
@@ -1,357 +0,0 @@
-// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package autocloseable;
-
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DeterminismChecker;
-import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.ForkJoinPool;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class AutoCloseableRetargeterExecutorServiceSubtypeTwrTest extends TestBase {
-
- @Parameter public TestParameters parameters;
-
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntime(CfVm.JDK21)
- .withDexRuntimes()
- .withApiLevelsStartingAtIncluding(AndroidApiLevel.L)
- .build();
- }
-
- public static String EXPECTED_OUTPUT =
- StringUtils.lines("close", "close", "close", "close", "close", "SUCCESS");
-
- @Test
- public void testJvm() throws Exception {
- assumeTrue(parameters.isCfRuntime());
- testForJvm(parameters)
- .addInnerClassesAndStrippedOuter(getClass())
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .run(parameters.getRuntime(), Main.class)
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
- }
-
- @Test
- public void testD8() throws Exception {
- assumeTrue(parameters.isDexRuntime());
- testForD8(parameters.getBackend())
- .addInnerClassesAndStrippedOuter(getClass())
- .setMinApi(parameters)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
- .compile()
- .addRunClasspathClassFileData((getAutoCloseableAndroidClassData(parameters)))
- .inspect(this::assertCloseMethodsAndTags)
- .run(
- parameters.getRuntime(),
- Main.class,
- String.valueOf(parameters.getApiLevel().getLevel()))
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
- }
-
- private void assertCloseMethodsAndTags(CodeInspector inspector) {
- for (Class<? extends ExecutorService> clazz :
- ImmutableList.of(
- PrintForkJoinPool.class,
- OverrideForkJoinPool.class,
- Executor1.class,
- Executor2.class)) {
- ClassSubject subj = inspector.clazz(clazz);
- Assert.assertTrue(subj.isPresent());
- Assert.assertTrue(subj.allMethods().stream().anyMatch(m -> m.getFinalName().equals("close")));
- Assert.assertTrue(
- subj.getDexProgramClass()
- .getInterfaces()
- .contains(inspector.getFactory().autoCloseableType));
- }
- }
-
- @Test
- public void testR8() throws Exception {
- assumeTrue(parameters.isDexRuntime());
- testForR8(parameters.getBackend())
- .addKeepMainRule(Main.class)
- .addInnerClassesAndStrippedOuter(getClass())
- .addInliningAnnotations()
- .setMinApi(parameters)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
- .compile()
- .addRunClasspathClassFileData((getAutoCloseableAndroidClassData(parameters)))
- .run(
- parameters.getRuntime(),
- Main.class,
- String.valueOf(parameters.getApiLevel().getLevel()))
- .assertSuccessWithOutput(EXPECTED_OUTPUT);
- }
-
- @Test
- public void testD8Determinism() throws Exception {
- assumeTrue(parameters.isDexRuntime());
- Path logDirectory = temp.newFolder().toPath();
- Path ref = compileWithD8Determinism(logDirectory);
- Path next = compileWithD8Determinism(logDirectory);
- assertProgramsEqual(ref, next);
- // Check that setting the determinism checker wrote a log file.
- assertTrue(Files.exists(logDirectory.resolve("0.log")));
- }
-
- private Path compileWithD8Determinism(Path logDirectory) throws Exception {
- return testForD8(parameters.getBackend())
- .addInnerClassesAndStrippedOuter(getClass())
- .setMinApi(parameters)
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
- .allowStdoutMessages()
- .addOptionsModification(
- options ->
- options
- .getTestingOptions()
- .setDeterminismChecker(DeterminismChecker.createWithFileBacking(logDirectory)))
- .compile()
- .writeToZip();
- }
-
- public static class PrintForkJoinPool extends ForkJoinPool {
-
- public void close() {
- super.close();
- System.out.println("close");
- }
- }
-
- public static class OverrideForkJoinPool extends ForkJoinPool {}
-
- public static class OverrideForkJoinPool2 extends OverrideForkJoinPool {}
-
- public static class Executor1 implements ExecutorService {
-
- boolean done = false;
-
- @Override
- public void shutdown() {
- done = true;
- }
-
- @Override
- public List<Runnable> shutdownNow() {
- done = true;
- return null;
- }
-
- @Override
- public boolean isShutdown() {
- return done;
- }
-
- @Override
- public boolean isTerminated() {
- return done;
- }
-
- @Override
- public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
- return true;
- }
-
- @Override
- public <T> Future<T> submit(Callable<T> task) {
- return null;
- }
-
- @Override
- public <T> Future<T> submit(Runnable task, T result) {
- return null;
- }
-
- @Override
- public Future<?> submit(Runnable task) {
- return null;
- }
-
- @Override
- public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
- throws InterruptedException {
- return null;
- }
-
- @Override
- public <T> List<Future<T>> invokeAll(
- Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
- throws InterruptedException {
- return null;
- }
-
- @Override
- public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
- throws InterruptedException, ExecutionException {
- return null;
- }
-
- @Override
- public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
- throws InterruptedException, ExecutionException, TimeoutException {
- return null;
- }
-
- @Override
- public void execute(Runnable command) {}
- }
-
- public static class Executor2 implements ExecutorService {
-
- boolean done = false;
-
- @Override
- public void shutdown() {
- done = true;
- }
-
- @Override
- public List<Runnable> shutdownNow() {
- done = true;
- return null;
- }
-
- @Override
- public boolean isShutdown() {
- return done;
- }
-
- @Override
- public boolean isTerminated() {
- return done;
- }
-
- public void close() {
- ExecutorService.super.close();
- System.out.println("close");
- }
-
- @Override
- public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException {
- return true;
- }
-
- @Override
- public <T> Future<T> submit(Callable<T> task) {
- return null;
- }
-
- @Override
- public <T> Future<T> submit(Runnable task, T result) {
- return null;
- }
-
- @Override
- public Future<?> submit(Runnable task) {
- return null;
- }
-
- @Override
- public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
- throws InterruptedException {
- return null;
- }
-
- @Override
- public <T> List<Future<T>> invokeAll(
- Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
- throws InterruptedException {
- return null;
- }
-
- @Override
- public <T> T invokeAny(Collection<? extends Callable<T>> tasks)
- throws InterruptedException, ExecutionException {
- return null;
- }
-
- @Override
- public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
- throws InterruptedException, ExecutionException, TimeoutException {
- return null;
- }
-
- @Override
- public void execute(Runnable command) {}
- }
-
- public static class Main {
-
- public static void main(String[] args) throws Exception {
- raw();
- subtypes();
- System.out.println("SUCCESS");
- }
-
- private static void subtypes() throws Exception {
- try (PrintForkJoinPool forkJoinPool = new PrintForkJoinPool()) {}
-
- try (ForkJoinPool forkJoinPool = new PrintForkJoinPool()) {}
-
- try (ExecutorService executorService = new PrintForkJoinPool()) {}
-
- try (OverrideForkJoinPool overrideForkJoinPool = new OverrideForkJoinPool()) {}
-
- try (ForkJoinPool overrideForkJoinPool1 = new OverrideForkJoinPool()) {}
-
- try (ExecutorService executorService = new OverrideForkJoinPool()) {}
-
- try (OverrideForkJoinPool2 overrideForkJoinPool = new OverrideForkJoinPool2()) {}
-
- try (OverrideForkJoinPool overrideForkJoinPool = new OverrideForkJoinPool2()) {}
-
- try (ForkJoinPool overrideForkJoinPool1 = new OverrideForkJoinPool2()) {}
-
- try (ExecutorService executorService = new OverrideForkJoinPool2()) {}
-
- try (Executor1 executorService = new Executor1()) {}
-
- try (ExecutorService executorService = new Executor1()) {}
-
- try (Executor2 executorService = new Executor2()) {}
-
- try (ExecutorService executorService = new Executor2()) {}
- }
-
- private static void raw() throws Exception {
- try (ForkJoinPool forkJoinPool = new ForkJoinPool()) {}
-
- try (ExecutorService forkJoinPool = new ForkJoinPool()) {}
- }
- }
-}
diff --git a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceTest.java b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceTest.java
index 5a47d26..ae043fd 100644
--- a/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceTest.java
+++ b/src/test/examplesJava21/autocloseable/AutoCloseableRetargeterExecutorServiceTest.java
@@ -49,6 +49,7 @@
public void testD8() throws Exception {
testForD8(parameters.getBackend())
.addInnerClassesAndStrippedOuter(getClass())
+ .addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true)
.setMinApi(parameters)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
.addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
@@ -67,6 +68,7 @@
.addKeepMainRule(Main.class)
.addInnerClassesAndStrippedOuter(getClass())
.addInliningAnnotations()
+ .addOptionsModification(opt -> opt.testing.enableAutoCloseableDesugaring = true)
.setMinApi(parameters)
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
.addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters))
diff --git a/src/test/examplesJava21/twr/ExecutorServiceBackportTest.java b/src/test/examplesJava21/twr/ExecutorServiceBackportTest.java
index a38220c..a57d54b 100644
--- a/src/test/examplesJava21/twr/ExecutorServiceBackportTest.java
+++ b/src/test/examplesJava21/twr/ExecutorServiceBackportTest.java
@@ -30,7 +30,6 @@
.withCfRuntimesStartingFromIncluding(CfVm.JDK21)
.withDexRuntimesStartingFromExcluding(Version.V4_4_4)
.withAllApiLevelsAlsoForCf()
- .withApiLevel(AndroidApiLevel.K)
.build();
}
@@ -61,6 +60,11 @@
}
}
+ @Override
+ public void testD8Cf() throws Exception {
+ super.testD8Cf();
+ }
+
public static class Main {
public static void main(String[] args) {
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
index 1713cf4..4cad84a 100644
--- a/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationProfileRewritingTest.java
@@ -18,13 +18,11 @@
import com.android.tools.r8.references.TypeReference;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.InternalOptions.InlinerOptions;
import com.android.tools.r8.utils.codeinspector.ClassSubject;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import com.android.tools.r8.utils.codeinspector.MethodSubject;
import com.google.common.collect.ImmutableList;
-import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -139,11 +137,6 @@
if (hasTwrCloseResourceApiOutlines()) {
expectedClassCount += 4;
}
- InternalOptions options = inspector.getApplication().options;
- options.setMinApiLevel(parameters.getApiLevel());
- if (options.shouldDesugarAutoCloseable()) {
- expectedClassCount += 12;
- }
inspector
.allClasses()
.forEach(c -> System.out.println(c.getDexProgramClass().toSourceString()));
@@ -247,52 +240,6 @@
syntheticTwrCloseResourceClassSubject5.uniqueMethod()));
}
- profileInspector.applyIf(
- options.shouldDesugarAutoCloseable(),
- i ->
- i.assertContainsClassRules(getCloseDispatcherSyntheticClasses(inspector))
- .assertContainsMethodRules(
- Arrays.stream(getCloseDispatcherSyntheticClasses(inspector))
- .map(ClassSubject::uniqueMethod)
- .toArray(MethodSubject[]::new)));
-
profileInspector.assertContainsNoOtherRules();
}
-
- private static ClassSubject[] getCloseDispatcherSyntheticClasses(CodeInspector inspector) {
- return new ClassSubject[] {
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableDispatcherClass(
- Reference.classFromTypeName(FOO), 0)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableDispatcherClass(
- Reference.classFromTypeName(FOO), 1)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableDispatcherClass(
- Reference.classFromTypeName(BAR), 0)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableDispatcherClass(
- Reference.classFromTypeName(BAR), 1)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableForwarderClass(
- Reference.classFromTypeName(FOO), 2)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableForwarderClass(
- Reference.classFromTypeName(FOO), 3)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableForwarderClass(
- Reference.classFromTypeName(BAR), 2)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticAutoCloseableForwarderClass(
- Reference.classFromTypeName(BAR), 3)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticThrowIAEClass(Reference.classFromTypeName(FOO), 4)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticThrowIAEClass(Reference.classFromTypeName(FOO), 5)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticThrowIAEClass(Reference.classFromTypeName(BAR), 4)),
- inspector.clazz(
- SyntheticItemsTestUtils.syntheticThrowIAEClass(Reference.classFromTypeName(BAR), 5))
- };
- }
}
diff --git a/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
index 471dffb..930ae37 100644
--- a/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
+++ b/src/test/examplesJava9/twr/twrcloseresourceduplication/TwrCloseResourceDuplicationTest.java
@@ -13,7 +13,6 @@
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import com.android.tools.r8.utils.ZipUtils;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -128,11 +127,6 @@
if (hasTwrCloseResourceApiOutlines()) {
expectedSynthetics += 1;
}
- InternalOptions options = inspector.getApplication().options;
- options.setMinApiLevel(parameters.getApiLevel());
- if (options.shouldDesugarAutoCloseable()) {
- expectedSynthetics += 3;
- }
assertEquals(INPUT_CLASSES + expectedSynthetics, inspector.allClasses().size());
});
}
@@ -167,19 +161,7 @@
.getTypeName());
assertEquals(classOutputWithSynthetics, foundClasses);
} else {
- Set<String> classOutputWithSynthetics = new HashSet<>(nonSyntheticClassOutput);
- if (parameters.getApiLevel().isLessThan(AndroidApiLevel.N)) {
- // Above N, the forwarder is inlined in the dispatcher.
- classOutputWithSynthetics.add(
- SyntheticItemsTestUtils.syntheticAutoCloseableForwarderClass(
- Reference.classFromTypeName(BAR), 1)
- .getTypeName());
- }
- classOutputWithSynthetics.add(
- SyntheticItemsTestUtils.syntheticAutoCloseableDispatcherClass(
- Reference.classFromTypeName(BAR), 0)
- .getTypeName());
- assertEquals(classOutputWithSynthetics, foundClasses);
+ assertEquals(nonSyntheticClassOutput, foundClasses);
}
});
}
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ContentProviderClientBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/ContentProviderClientBackportTest.java
index f666284..8d3b5f2 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/ContentProviderClientBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ContentProviderClientBackportTest.java
@@ -4,20 +4,12 @@
package com.android.tools.r8.desugar.backports;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.compileAutoCloseableAndroidLibraryClasses;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.ContentProviderClient;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import org.junit.Test;
@@ -30,19 +22,16 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
- .withDexRuntimes()
- .withAllApiLevelsAlsoForCf()
- .build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
public ContentProviderClientBackportTest(TestParameters parameters) throws IOException {
super(
parameters,
- DescriptorUtils.descriptorToJavaType(
- DexItemFactory.androidContentContentProviderClientDescriptorString),
- ImmutableList.of(ContentProviderClientBackportTest.getTestRunner()));
+ ContentProviderClientBackportTest.getContentProviderClient(parameters),
+ ImmutableList.of(
+ ContentProviderClientBackportTest.getTestRunner(),
+ ContentProviderClientBackportTest.getContentProviderClient(parameters)));
// The constructor is used by the test and release has been available since API 5 and is the
// method close is rewritten to.
@@ -53,27 +42,6 @@
registerTarget(AndroidApiLevel.N, 1);
}
- @Override
- protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
- super.configureProgram(builder);
- if (builder.isJvmTestBuilder()) {
- builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
- } else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
- @Override
- protected void configure(D8TestCompileResult builder) throws Exception {
- if (parameters.isDexRuntime()) {
- builder.addBootClasspathFiles(compileAutoCloseableAndroidLibraryClasses(this, parameters));
- } else {
- builder.addRunClasspathClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
@@ -81,7 +49,19 @@
.apply(this::configureProgram)
.run(parameters.getRuntime(), getTestClassName())
// Fails when not desugared.
- .assertFailureWithErrorThatMatches(containsString("close should not be called"));
+ .assertFailureWithErrorThatMatches(containsString("Failed: close should not be called"));
+ }
+
+ private static byte[] getContentProviderClient(TestParameters parameters) throws IOException {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
+ return transformer(ContentProviderClientApiLevel24.class)
+ .setClassDescriptor(DexItemFactory.androidContentContentProviderClientDescriptorString)
+ .transform();
+ } else {
+ return transformer(ContentProviderClient.class)
+ .setClassDescriptor(DexItemFactory.androidContentContentProviderClientDescriptorString)
+ .transform();
+ }
}
private static byte[] getTestRunner() throws IOException {
@@ -92,6 +72,32 @@
.transform();
}
+ public static class ContentProviderClient {
+ public boolean wasClosed = false;
+
+ public void close() {
+ TestRunner.doFail("close should not be called");
+ }
+
+ public boolean release() {
+ wasClosed = true;
+ return wasClosed;
+ }
+ }
+
+ public static class ContentProviderClientApiLevel24 {
+ public boolean wasClosed = false;
+
+ public void close() {
+ wasClosed = true;
+ }
+
+ public boolean release() {
+ TestRunner.doFail("release should not be called");
+ return true;
+ }
+ }
+
public static class TestRunner extends MiniAssert {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/DrmManagerClientBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/DrmManagerClientBackportTest.java
index ab89582..5d3ee55 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/DrmManagerClientBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/DrmManagerClientBackportTest.java
@@ -4,20 +4,12 @@
package com.android.tools.r8.desugar.backports;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.compileAutoCloseableAndroidLibraryClasses;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.DrmManagerClient;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import org.junit.Test;
@@ -30,19 +22,16 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
- .withDexRuntimes()
- .withAllApiLevelsAlsoForCf()
- .build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
public DrmManagerClientBackportTest(TestParameters parameters) throws IOException {
super(
parameters,
- DescriptorUtils.descriptorToJavaType(
- DexItemFactory.androidDrmDrmManagerClientDescriptorString),
- ImmutableList.of(DrmManagerClientBackportTest.getTestRunner()));
+ DrmManagerClientBackportTest.getDrmManagerClient(parameters),
+ ImmutableList.of(
+ DrmManagerClientBackportTest.getTestRunner(),
+ DrmManagerClientBackportTest.getDrmManagerClient(parameters)));
// The constructor is used by the test and release has been available since API 5 and is the
// method close is rewritten to.
@@ -53,27 +42,6 @@
registerTarget(AndroidApiLevel.N, 1);
}
- @Override
- protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
- super.configureProgram(builder);
- if (builder.isJvmTestBuilder()) {
- builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
- } else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
- @Override
- protected void configure(D8TestCompileResult builder) throws Exception {
- if (parameters.isDexRuntime()) {
- builder.addBootClasspathFiles(compileAutoCloseableAndroidLibraryClasses(this, parameters));
- } else {
- builder.addRunClasspathClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
@@ -81,7 +49,19 @@
.apply(this::configureProgram)
.run(parameters.getRuntime(), getTestClassName())
// Fails when not desugared.
- .assertFailureWithErrorThatMatches(containsString("close should not be called"));
+ .assertFailureWithErrorThatMatches(containsString("Failed: close should not be called"));
+ }
+
+ private static byte[] getDrmManagerClient(TestParameters parameters) throws IOException {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
+ return transformer(DrmManagerClientApiLevel24.class)
+ .setClassDescriptor(DexItemFactory.androidDrmDrmManagerClientDescriptorString)
+ .transform();
+ } else {
+ return transformer(DrmManagerClient.class)
+ .setClassDescriptor(DexItemFactory.androidDrmDrmManagerClientDescriptorString)
+ .transform();
+ }
}
private static byte[] getTestRunner() throws IOException {
@@ -92,6 +72,30 @@
.transform();
}
+ public static class DrmManagerClient {
+ public boolean wasClosed = false;
+
+ public void close() {
+ TestRunner.doFail("close should not be called");
+ }
+
+ public void release() {
+ wasClosed = true;
+ }
+ }
+
+ public static class DrmManagerClientApiLevel24 {
+ public boolean wasClosed = false;
+
+ public void close() {
+ wasClosed = true;
+ }
+
+ public void release() {
+ TestRunner.doFail("release should not be called");
+ }
+ }
+
public static class TestRunner extends MiniAssert {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/MediaDrmBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/MediaDrmBackportTest.java
index 3584912..144d841 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/MediaDrmBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/MediaDrmBackportTest.java
@@ -4,20 +4,12 @@
package com.android.tools.r8.desugar.backports;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.compileAutoCloseableAndroidLibraryClasses;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.MediaDrm;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import org.junit.Test;
@@ -30,18 +22,15 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
- .withDexRuntimes()
- .withAllApiLevelsAlsoForCf()
- .build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
public MediaDrmBackportTest(TestParameters parameters) throws IOException {
super(
parameters,
- DescriptorUtils.descriptorToJavaType(DexItemFactory.androidMediaMediaDrmDescriptorString),
- ImmutableList.of(MediaDrmBackportTest.getTestRunner()));
+ MediaDrmBackportTest.getMediaDrm(parameters),
+ ImmutableList.of(
+ MediaDrmBackportTest.getTestRunner(), MediaDrmBackportTest.getMediaDrm(parameters)));
// The constructor is used by the test and release has been available since API 18 and is the
// method close is rewritten to.
@@ -52,27 +41,6 @@
registerTarget(AndroidApiLevel.P, 1);
}
- @Override
- protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
- super.configureProgram(builder);
- if (builder.isJvmTestBuilder()) {
- builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
- } else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
- @Override
- protected void configure(D8TestCompileResult builder) throws Exception {
- if (parameters.isDexRuntime()) {
- builder.addBootClasspathFiles(compileAutoCloseableAndroidLibraryClasses(this, parameters));
- } else {
- builder.addRunClasspathClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
@@ -80,7 +48,19 @@
.apply(this::configureProgram)
.run(parameters.getRuntime(), getTestClassName())
// Fails when not desugared.
- .assertFailureWithErrorThatMatches(containsString("close should not be called"));
+ .assertFailureWithErrorThatMatches(containsString("Failed: close should not be called"));
+ }
+
+ private static byte[] getMediaDrm(TestParameters parameters) throws IOException {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.P)) {
+ return transformer(MediaDrmApiLevel28.class)
+ .setClassDescriptor(DexItemFactory.androidMediaMediaDrmDescriptorString)
+ .transform();
+ } else {
+ return transformer(MediaDrm.class)
+ .setClassDescriptor(DexItemFactory.androidMediaMediaDrmDescriptorString)
+ .transform();
+ }
}
private static byte[] getTestRunner() throws IOException {
@@ -90,6 +70,30 @@
.transform();
}
+ public static class MediaDrm {
+ public boolean wasClosed = false;
+
+ public void close() {
+ TestRunner.doFail("close should not be called");
+ }
+
+ public void release() {
+ wasClosed = true;
+ }
+ }
+
+ public static class MediaDrmApiLevel28 {
+ public boolean wasClosed = false;
+
+ public void close() {
+ wasClosed = true;
+ }
+
+ public void release() {
+ TestRunner.doFail("release should not be called");
+ }
+ }
+
public static class TestRunner extends MiniAssert {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/MediaMetadataRetrieverBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/MediaMetadataRetrieverBackportTest.java
index 9b324ef..d2cb8f8 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/MediaMetadataRetrieverBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/MediaMetadataRetrieverBackportTest.java
@@ -4,20 +4,12 @@
package com.android.tools.r8.desugar.backports;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.compileAutoCloseableAndroidLibraryClasses;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.MediaMetadataRetriever;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import org.junit.Test;
@@ -30,19 +22,16 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
- .withDexRuntimes()
- .withAllApiLevelsAlsoForCf()
- .build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
public MediaMetadataRetrieverBackportTest(TestParameters parameters) throws IOException {
super(
parameters,
- DescriptorUtils.descriptorToJavaType(
- DexItemFactory.androidMediaMediaMetadataRetrieverDescriptorString),
- ImmutableList.of(MediaMetadataRetrieverBackportTest.getTestRunner()));
+ MediaMetadataRetrieverBackportTest.getMediaMetadataRetriever(parameters),
+ ImmutableList.of(
+ MediaMetadataRetrieverBackportTest.getTestRunner(),
+ MediaMetadataRetrieverBackportTest.getMediaMetadataRetriever(parameters)));
// The constructor is used by the test and release has been available since API 10 and is the
// method close is rewritten to.
@@ -53,27 +42,6 @@
registerTarget(AndroidApiLevel.Q, 1);
}
- @Override
- protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
- super.configureProgram(builder);
- if (builder.isJvmTestBuilder()) {
- builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
- } else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
- @Override
- protected void configure(D8TestCompileResult builder) throws Exception {
- if (parameters.isDexRuntime()) {
- builder.addBootClasspathFiles(compileAutoCloseableAndroidLibraryClasses(this, parameters));
- } else {
- builder.addRunClasspathClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
@@ -81,7 +49,19 @@
.apply(this::configureProgram)
.run(parameters.getRuntime(), getTestClassName())
// Fails when not desugared.
- .assertFailureWithErrorThatMatches(containsString("close should not be called"));
+ .assertFailureWithErrorThatMatches(containsString("Failed: close should not be called"));
+ }
+
+ private static byte[] getMediaMetadataRetriever(TestParameters parameters) throws IOException {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.Q)) {
+ return transformer(MediaMetadataRetrieverApiLevel29.class)
+ .setClassDescriptor(DexItemFactory.androidMediaMediaMetadataRetrieverDescriptorString)
+ .transform();
+ } else {
+ return transformer(MediaMetadataRetriever.class)
+ .setClassDescriptor(DexItemFactory.androidMediaMediaMetadataRetrieverDescriptorString)
+ .transform();
+ }
}
private static byte[] getTestRunner() throws IOException {
@@ -92,6 +72,30 @@
.transform();
}
+ public static class MediaMetadataRetriever {
+ public boolean wasClosed = false;
+
+ public void close() {
+ TestRunner.doFail("close should not be called");
+ }
+
+ public void release() {
+ wasClosed = true;
+ }
+ }
+
+ public static class MediaMetadataRetrieverApiLevel29 {
+ public boolean wasClosed = false;
+
+ public void close() {
+ wasClosed = true;
+ }
+
+ public void release() {
+ TestRunner.doFail("release should not be called");
+ }
+ }
+
public static class TestRunner extends MiniAssert {
public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/TypedArrayBackportTest.java b/src/test/java/com/android/tools/r8/desugar/backports/TypedArrayBackportTest.java
index ab6ddb3..1b7e834 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/TypedArrayBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/TypedArrayBackportTest.java
@@ -4,20 +4,12 @@
package com.android.tools.r8.desugar.backports;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.compileAutoCloseableAndroidLibraryClasses;
-import static com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.getAutoCloseableAndroidClassData;
import static org.hamcrest.CoreMatchers.containsString;
-import com.android.tools.r8.D8TestCompileResult;
-import com.android.tools.r8.TestBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.desugar.AutoCloseableAndroidLibraryFileData.TypedArray;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.DescriptorUtils;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import org.junit.Test;
@@ -30,19 +22,16 @@
@Parameters(name = "{0}")
public static TestParametersCollection data() {
- return getTestParameters()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK11)
- .withDexRuntimes()
- .withAllApiLevelsAlsoForCf()
- .build();
+ return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
}
public TypedArrayBackportTest(TestParameters parameters) throws IOException {
super(
parameters,
- DescriptorUtils.descriptorToJavaType(
- DexItemFactory.androidContentResTypedArrayDescriptorString),
- ImmutableList.of(TypedArrayBackportTest.getTestRunner()));
+ TypedArrayBackportTest.getTypedArray(parameters),
+ ImmutableList.of(
+ TypedArrayBackportTest.getTestRunner(),
+ TypedArrayBackportTest.getTypedArray(parameters)));
// The constructor is used by the test and recycle has been available since API 1 and is the
// method close is rewritten to.
@@ -53,27 +42,6 @@
registerTarget(AndroidApiLevel.S, 1);
}
- @Override
- protected void configureProgram(TestBuilder<?, ?> builder) throws Exception {
- super.configureProgram(builder);
- if (builder.isJvmTestBuilder()) {
- builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
- } else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
- @Override
- protected void configure(D8TestCompileResult builder) throws Exception {
- if (parameters.isDexRuntime()) {
- builder.addBootClasspathFiles(compileAutoCloseableAndroidLibraryClasses(this, parameters));
- } else {
- builder.addRunClasspathClassFileData(getAutoCloseableAndroidClassData(parameters));
- }
- }
-
@Test
public void testJvm() throws Exception {
parameters.assumeJvmTestParameters();
@@ -81,7 +49,19 @@
.apply(this::configureProgram)
.run(parameters.getRuntime(), getTestClassName())
// Fails when not desugared.
- .assertFailureWithErrorThatMatches(containsString("close should not be called"));
+ .assertFailureWithErrorThatMatches(containsString("Failed: close should not be called"));
+ }
+
+ private static byte[] getTypedArray(TestParameters parameters) throws IOException {
+ if (parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.S)) {
+ return transformer(TypedArrayAndroidApiLevel31.class)
+ .setClassDescriptor(DexItemFactory.androidContentResTypedArrayDescriptorString)
+ .transform();
+ } else {
+ return transformer(TypedArray.class)
+ .setClassDescriptor(DexItemFactory.androidContentResTypedArrayDescriptorString)
+ .transform();
+ }
}
private static byte[] getTestRunner() throws IOException {
@@ -92,6 +72,30 @@
.transform();
}
+ public static class TypedArray {
+ public boolean wasClosed = false;
+
+ public void close() {
+ TestRunner.doFail("close should not be called");
+ }
+
+ public void recycle() {
+ wasClosed = true;
+ }
+ }
+
+ public static class TypedArrayAndroidApiLevel31 {
+ public boolean wasClosed = false;
+
+ public void close() {
+ wasClosed = true;
+ }
+
+ public void recycle() {
+ TestRunner.doFail("recycle should not be called");
+ }
+ }
+
public static class TestRunner extends MiniAssert {
public static void main(String[] args) {
diff --git a/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java b/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
index f2c3ee2..cdbf02f 100644
--- a/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
+++ b/src/test/testbase/java/com/android/tools/r8/desugar/backports/AbstractBackportTest.java
@@ -242,6 +242,7 @@
.compileWithExpectedDiagnostics(this::checkDiagnostics)
.apply(this::configure)
.inspect(this::assertDesugaring)
+ .apply(this::configure)
.run(parameters.getRuntime(), testClassName)
.apply(runResultConsumer);
}
diff --git a/src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
index 899a073..da0c617 100644
--- a/src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/testbase/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -155,20 +155,6 @@
return syntheticClass(reference, naming.TWR_CLOSE_RESOURCE, id);
}
- public static ClassReference syntheticAutoCloseableDispatcherClass(
- ClassReference classReference, int id) {
- return syntheticClass(classReference, naming.AUTOCLOSEABLE_DISPATCHER, id);
- }
-
- public static ClassReference syntheticAutoCloseableForwarderClass(
- ClassReference classReference, int id) {
- return syntheticClass(classReference, naming.AUTOCLOSEABLE_FORWARDER, id);
- }
-
- public static ClassReference syntheticThrowIAEClass(ClassReference classReference, int id) {
- return syntheticClass(classReference, naming.THROW_IAE, id);
- }
-
public static MethodReference syntheticLambdaMethod(Class<?> clazz, int id, Method method) {
ClassReference syntheticHolder = syntheticLambdaClass(clazz, id);
MethodReference originalMethod = Reference.methodFromMethod(method);