Fix lint for JDK11
Change-Id: Ia97ad7d4ccfd76be083f12b3b691e7bd42933329
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index af340d4..d200241 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -250,8 +250,7 @@
Set<DexClass> classesWithAllMethodsSupported = Sets.newIdentityHashSet();
Map<DexClass, List<DexEncodedMethod>> supportedMethods = new LinkedHashMap<>();
for (DexProgramClass clazz : dexApplication.classes()) {
- if (clazz.accessFlags.isPublic()
- && desugaredLibrarySpecification.getRewriteType().containsKey(clazz.type)) {
+ if (clazz.accessFlags.isPublic() && desugaredLibrarySpecification.isSupported(clazz.type)) {
DexProgramClass implementationClass =
implementationApplication.programDefinitionFor(clazz.getType());
if (implementationClass == null) {
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 3c4a223..272fb87 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
@@ -37,6 +37,8 @@
private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+ private List<String> lintContents;
+
@Parameters(name = "{0}, spec: {1}")
public static List<Object[]> data() {
return buildParameters(getTestParameters().withNoneRuntime().build(), getJdk8Jdk11());
@@ -48,78 +50,105 @@
this.libraryDesugaringSpecification = libraryDesugaringSpecification;
}
+ private boolean supportsAllMethodsOf(String type) {
+ return lintContents.contains(type);
+ }
+
+ private boolean supportsMethodButNotAllMethodsInClass(String method) {
+ assert method.contains("#");
+ return !supportsAllMethodsOf(method.split("#")[0]) && lintContents.contains(method);
+ }
+
private void checkFileContent(AndroidApiLevel minApiLevel, Path lintFile) throws Exception {
// Just do some light probing in the generated lint files.
- List<String> methods = FileUtils.readAllLines(lintFile);
+ lintContents = FileUtils.readAllLines(lintFile);
// All methods supported on Optional*.
- assertTrue(methods.contains("java/util/Optional"));
- assertTrue(methods.contains("java/util/OptionalInt"));
-
- // ConcurrentHashMap is fully supported on JDK 11.
- assertEquals(
- libraryDesugaringSpecification != JDK8,
- methods.contains("java/util/concurrent/ConcurrentHashMap"));
+ assertTrue(supportsAllMethodsOf("java/util/Optional"));
+ assertTrue(supportsAllMethodsOf("java/util/OptionalInt"));
// No parallel* methods pre L, and all stream methods supported from L.
assertEquals(
minApiLevel == AndroidApiLevel.L,
- methods.contains("java/util/Collection#parallelStream()Ljava/util/stream/Stream;"));
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/Collection#parallelStream()Ljava/util/stream/Stream;"));
assertEquals(
- minApiLevel == AndroidApiLevel.L, methods.contains("java/util/stream/DoubleStream"));
+ minApiLevel == AndroidApiLevel.L, supportsAllMethodsOf("java/util/stream/DoubleStream"));
assertFalse(
- methods.contains(
+ supportsMethodButNotAllMethodsInClass(
"java/util/stream/DoubleStream#parallel()Ljava/util/stream/DoubleStream;"));
assertFalse(
- methods.contains("java/util/stream/DoubleStream#parallel()Ljava/util/stream/BaseStream;"));
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/stream/DoubleStream#parallel()Ljava/util/stream/BaseStream;"));
assertEquals(
minApiLevel == AndroidApiLevel.B,
- methods.contains(
+ supportsMethodButNotAllMethodsInClass(
"java/util/stream/DoubleStream#allMatch(Ljava/util/function/DoublePredicate;)Z"));
- assertEquals(minApiLevel == AndroidApiLevel.L, methods.contains("java/util/stream/IntStream"));
+ assertEquals(
+ minApiLevel == AndroidApiLevel.L, lintContents.contains("java/util/stream/IntStream"));
assertFalse(
- methods.contains("java/util/stream/IntStream#parallel()Ljava/util/stream/IntStream;"));
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/stream/IntStream#parallel()Ljava/util/stream/IntStream;"));
assertFalse(
- methods.contains("java/util/stream/IntStream#parallel()Ljava/util/stream/BaseStream;"));
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/stream/IntStream#parallel()Ljava/util/stream/BaseStream;"));
assertEquals(
minApiLevel == AndroidApiLevel.B,
- methods.contains(
+ supportsMethodButNotAllMethodsInClass(
"java/util/stream/IntStream#allMatch(Ljava/util/function/IntPredicate;)Z"));
- if (libraryDesugaringSpecification != JDK8) {
- // TODO(b/203382252): Investigate why the following assertions are not working on JDK 11.
- return;
+ 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.
+ assertTrue(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/concurrent/ConcurrentHashMap#getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"));
+
+ // Don't include constructors.
+ assertFalse(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/concurrent/ConcurrentHashMap#<init>()V"));
+
+ // Unsupported methods on ConcurrentHashMap.
+ assertFalse(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/concurrent/ConcurrentHashMap#reduce(JLjava/util/function/BiFunction;Ljava/util/function/BiFunction;)Ljava/lang/Object;"));
+ assertFalse(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/concurrent/ConcurrentHashMap#newKeySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
}
- // Supported methods on ConcurrentHashMap.
+ // Maintain type.
+ assertEquals(
+ libraryDesugaringSpecification != JDK8,
+ supportsAllMethodsOf("java/io/UncheckedIOException"));
+
+ // Retarget method.
assertTrue(
- methods.contains(
- "java/util/concurrent/ConcurrentHashMap#getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"));
-
- // Don't include constructors.
- assertFalse(methods.contains("java/util/concurrent/ConcurrentHashMap#<init>()V"));
-
- // Unsupported methods on ConcurrentHashMap.
- assertFalse(
- methods.contains(
- "java/util/concurrent/ConcurrentHashMap#reduce(JLjava/util/function/BiFunction;Ljava/util/function/BiFunction;)Ljava/lang/Object;"));
- assertFalse(
- methods.contains(
- "java/util/concurrent/ConcurrentHashMap#newKeySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;"));
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/Arrays#spliterator([I)Ljava/util/Spliterator$OfInt;"));
// Emulated interface default method.
- assertTrue(methods.contains("java/util/List#spliterator()Ljava/util/Spliterator;"));
+ assertTrue(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/List#spliterator()Ljava/util/Spliterator;"));
// Emulated interface static method.
- assertTrue(methods.contains("java/util/Map$Entry#comparingByValue()Ljava/util/Comparator;"));
+ assertTrue(
+ supportsMethodButNotAllMethodsInClass(
+ "java/util/Map$Entry#comparingByValue()Ljava/util/Comparator;"));
// No no-default method from emulated interface.
- assertFalse(methods.contains("java/util/List#size()I"));
+ assertFalse(supportsMethodButNotAllMethodsInClass("java/util/List#size()I"));
// File should be sorted.
- List<String> sorted = new ArrayList<>(methods);
+ List<String> sorted = new ArrayList<>(lintContents);
sorted.sort(Comparator.naturalOrder());
- assertEquals(methods, sorted);
+ assertEquals(lintContents, sorted);
}
@Test