Introduce AutoCloseable#close overrides in lint backport
Bug: b/401147877
Change-Id: I111ab901ed333bf56fe33da4e19dec95f3e2e4a5
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 4b1f7ea..0743777 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -66,6 +66,7 @@
import com.android.tools.r8.ir.desugar.backports.SparseArrayMethodRewrites;
import com.android.tools.r8.ir.desugar.backports.TypedArrayMethodRewrites;
import com.android.tools.r8.ir.desugar.desugaredlibrary.LibraryDesugaringOptions;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.AutoCloseableRetargeterHelper;
import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeter;
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
@@ -220,6 +221,8 @@
new BackportedMethodRewriter.RewritableMethods(appView);
rewritableMethods.visit(methods);
new DesugaredLibraryRetargeter(appView).visit(methods);
+ new AutoCloseableRetargeterHelper(options.getMinApiLevel(), options.dexItemFactory())
+ .visit(methods);
rewritableMethods.visitFields(fields);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
index 9107e31..a986672 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/AutoCloseableRetargeterHelper.java
@@ -284,4 +284,16 @@
.appInfoForDesugaring()
.lookupMaximallySpecificMethod(context.getContextClass(), target);
}
+
+ public void visit(Consumer<DexMethod> methods) {
+ if (minApiLevel.isLessThan(AndroidApiLevel.K)) {
+ return;
+ }
+ forEachAutoCloseableMissingSubimplementation(
+ type -> {
+ if (!isFinalClassImplementingAutoCloseable(type)) {
+ methods.accept(createCloseMethod(type));
+ }
+ });
+ }
}
diff --git a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
index 37f266a..dc9c64e 100644
--- a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
+++ b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
@@ -75,6 +75,11 @@
apiLevel < AndroidApiLevel.O.getLevel(),
backports.contains("java/lang/Short#toUnsignedLong(S)J"));
+ // ExecutorService#close up to api level V.
+ assertEquals(
+ apiLevel <= AndroidApiLevel.V.getLevel(),
+ backports.contains("java/util/concurrent/ExecutorService#close()V"));
+
// Java 9, 10 and 11 Optional methods added at API level T
// They require Android N or library desugaring to be backported.
// The methods are not backported in desugared library JDK 11 (already present).