Partial fix for AutoCloseable desugaring
R=clementbera@google.com
Bug: b/418143856
Change-Id: I6b1b9df118f8b02ffec20bac2c0960125414bea5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
index 99ace92..88a2360 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeter.java
@@ -70,11 +70,14 @@
AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
MethodResolutionResult resolutionResult =
appInfo.resolveMethodLegacy(invokedMethod, cfInvoke.isInterface());
- if (!resolutionResult.isSingleResolution()) {
- return DesugarDescription.nothing();
+ DexMethod reference;
+ if (resolutionResult.isSingleResolution()) {
+ reference = resolutionResult.asSingleResolution().getResolvedMethod().getReference();
+ } else {
+ // If resolution fails, we use the invokedMethod as the result to desugar most cases if the
+ // library is not present to be backward compatible to what the BakportedMethodRewriter does.
+ reference = invokedMethod;
}
- assert resolutionResult.getSingleTarget() != null;
- DexMethod reference = resolutionResult.getSingleTarget().getReference();
if (data.shouldEmulateMethod(reference)) {
return computeNewTarget(reference, cfInvoke.isInvokeSuper(context.getHolderType()), context);
}
diff --git a/src/test/java21/com/android/tools/r8/jdk21/autocloseable/AutoCloseableRetargeterAndroidTest.java b/src/test/java21/com/android/tools/r8/jdk21/autocloseable/AutoCloseableRetargeterAndroidTest.java
index 7d8aac2..db85406 100644
--- a/src/test/java21/com/android/tools/r8/jdk21/autocloseable/AutoCloseableRetargeterAndroidTest.java
+++ b/src/test/java21/com/android/tools/r8/jdk21/autocloseable/AutoCloseableRetargeterAndroidTest.java
@@ -11,7 +11,6 @@
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;
@@ -24,6 +23,8 @@
import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
+import java.util.List;
+import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -32,19 +33,30 @@
@RunWith(Parameterized.class)
public class AutoCloseableRetargeterAndroidTest extends AbstractBackportTest {
- @Parameters(name = "{0}")
- public static TestParametersCollection data() {
- return getTestParameters()
- .withDexRuntimes()
- .withCfRuntimesStartingFromIncluding(CfVm.JDK21)
- .withApiLevelsStartingAtIncluding(AndroidApiLevel.K)
- .enableApiLevelsForCf()
- .build();
+ enum CompileTimeLib {
+ NONE,
+ DEFAULT,
+ FULL
}
- public AutoCloseableRetargeterAndroidTest(TestParameters parameters) throws IOException {
- super(parameters, getTestRunner(), ImmutableList.of(getTestRunner()));
+ private final CompileTimeLib compileTimeLib;
+ @Parameters(name = "{0}, lib: {1}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimes()
+ .withCfRuntimesStartingFromIncluding(CfVm.JDK21)
+ .withApiLevelsStartingAtIncluding(AndroidApiLevel.K)
+ .enableApiLevelsForCf()
+ .build(),
+ CompileTimeLib.values());
+ }
+
+ public AutoCloseableRetargeterAndroidTest(
+ TestParameters parameters, CompileTimeLib compileTimeLib) throws IOException {
+ super(parameters, getTestRunner(), ImmutableList.of(getTestRunner()));
+ this.compileTimeLib = compileTimeLib;
// The constructor is used by the test and release has been available since API 5 and is the
// method close is rewritten to.
ignoreInvokes("<init>");
@@ -58,9 +70,19 @@
if (builder.isJvmTestBuilder()) {
builder.addProgramClassFileData(getAutoCloseableAndroidClassData(parameters));
} else {
- builder
- .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
- .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
+ if (compileTimeLib == CompileTimeLib.FULL) {
+ builder
+ .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.BAKLAVA))
+ .addLibraryClassFileData(getAutoCloseableAndroidClassData(parameters));
+ } else if (compileTimeLib == CompileTimeLib.NONE) {
+ if (builder.isD8TestBuilder()) {
+ builder.asD8TestBuilder().setUseDefaultRuntimeLibrary(false);
+ } else {
+ assert builder.isJvmTestBuilder();
+ // No need to run without default runtime library on the JVM.
+ Assume.assumeFalse(builder.isJvmTestBuilder());
+ }
+ }
}
}