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