Fix desugared library linter
- fix and enable lint for compileSDK 33
- fix and enable testing of lint for minimal and nio
Change-Id: I152f38b4ca6a0e3d07063d0baae3c7dd9918605c
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
index e93c6c6..752964b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/lint/GenerateLintFiles.java
@@ -36,6 +36,7 @@
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.graph.MethodCollection.MethodCollectionFactory;
import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.ir.desugar.BackportedMethodRewriter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
@@ -253,6 +254,11 @@
DirectMappedDexApplication implementationApplication =
new ApplicationReader(implementation, options, Timing.empty()).read().toDirect();
+ options.setDesugaredLibrarySpecification(desugaredLibrarySpecification);
+ List<DexMethod> backports =
+ BackportedMethodRewriter.generateListOfBackportedMethods(
+ implementation, options, ThreadUtils.getExecutorService(1));
+
// Collect all the methods that the library desugar configuration adds support for.
Set<DexClass> classesWithAllMethodsSupported = Sets.newIdentityHashSet();
Map<DexClass, List<DexEncodedMethod>> supportedMethods = new LinkedHashMap<>();
@@ -271,7 +277,8 @@
ProgramMethod implementationMethod =
implementationClass.lookupProgramMethod(method.getReference());
// Don't include methods which are not implemented by the desugared library.
- if (supported.test(method) && implementationMethod != null) {
+ if (supported.test(method)
+ && (implementationMethod != null || backports.contains(method.getReference()))) {
supportedMethods.computeIfAbsent(clazz, k -> new ArrayList<>()).add(method);
} else {
allMethodsAdded = false;
@@ -404,7 +411,7 @@
private void run() throws Exception {
// Run over all the API levels that the desugared library can be compiled with.
- for (int apiLevel = AndroidApiLevel.Sv2.getLevel();
+ for (int apiLevel = AndroidApiLevel.T.getLevel();
apiLevel >= desugaredLibrarySpecification.getRequiredCompilationApiLevel().getLevel();
apiLevel--) {
System.out.println("Generating lint files for compile API " + apiLevel);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index 17ed737..86c1430 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -4,8 +4,9 @@
package com.android.tools.r8.desugar.desugaredlibrary;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_MINIMAL;
import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8AndAll3Jdk11;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -41,7 +42,7 @@
@Parameters(name = "{0}, spec: {1}")
public static List<Object[]> data() {
- return buildParameters(getTestParameters().withNoneRuntime().build(), getJdk8Jdk11());
+ return buildParameters(getTestParameters().withNoneRuntime().build(), getJdk8AndAll3Jdk11());
}
public LintFilesTest(
@@ -63,6 +64,18 @@
// Just do some light probing in the generated lint files.
lintContents = FileUtils.readAllLines(lintFile);
+ // All methods supported on CHM.
+ assertEquals(
+ libraryDesugaringSpecification != JDK8,
+ supportsAllMethodsOf("java/util/concurrent/ConcurrentHashMap"));
+
+ // All methods supported on BiFunction with maintain prefix.
+ assertTrue(supportsAllMethodsOf("java/util/function/BiFunction"));
+
+ if (libraryDesugaringSpecification == JDK11_MINIMAL) {
+ return;
+ }
+
// All methods supported on Optional*.
assertTrue(supportsAllMethodsOf("java/util/Optional"));
assertTrue(supportsAllMethodsOf("java/util/OptionalInt"));
@@ -97,10 +110,6 @@
supportsMethodButNotAllMethodsInClass(
"java/util/stream/IntStream#allMatch(Ljava/util/function/IntPredicate;)Z"));
- assertEquals(
- libraryDesugaringSpecification != JDK8,
- supportsAllMethodsOf("java/util/concurrent/ConcurrentHashMap"));
-
// Checks specific methods are supported or not in JDK8, all is supported in JDK11.
if (libraryDesugaringSpecification == JDK8) {
// Supported methods on ConcurrentHashMap.
@@ -174,7 +183,7 @@
AndroidApiLevel.B.getLevel());
for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
- if (apiLevel.isGreaterThan(AndroidApiLevel.Sv2)) {
+ if (apiLevel.isGreaterThan(AndroidApiLevel.T)) {
continue;
}
Path compileApiLevelDirectory = directory.resolve("compile_api_level_" + apiLevel.getLevel());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
index 78a70c5..7f89255 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
@@ -270,6 +270,10 @@
return ImmutableList.of(JDK8, JDK11);
}
+ public static List<LibraryDesugaringSpecification> getJdk8AndAll3Jdk11() {
+ return ImmutableList.of(JDK8, JDK11, JDK11_MINIMAL, JDK11_PATH);
+ }
+
public DexApplication getAppForTesting(InternalOptions options, boolean libraryCompilation)
throws IOException {
AndroidApp.Builder builder = AndroidApp.builder();