Desugared library: add support for T apis
Change-Id: Id89a2130d026e311ba47d86dd318e720807d9d1a
diff --git a/src/library_desugar/desugar_jdk_libs.json b/src/library_desugar/desugar_jdk_libs.json
index 1b2e6bf..6f57d4c 100644
--- a/src/library_desugar/desugar_jdk_libs.json
+++ b/src/library_desugar/desugar_jdk_libs.json
@@ -2,7 +2,7 @@
"configuration_format_version": 3,
"group_id" : "com.tools.android",
"artifact_id" : "desugar_jdk_libs",
- "version": "1.1.7",
+ "version": "1.1.8",
"required_compilation_api_level": 26,
"synthesized_library_classes_package_prefix": "j$.",
"support_all_callbacks_from_library": true,
@@ -10,7 +10,8 @@
{
"api_level_below_or_equal": 25,
"wrapper_conversion": [
- "java.time.Clock"
+ "java.time.Clock",
+ "java.time.temporal.ChronoUnit"
]
},
{
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index e3caa6e..5f68c31 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -20,7 +20,8 @@
"java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
},
"wrapper_conversion": [
- "java.time.Clock"
+ "java.time.Clock",
+ "java.time.temporal.ChronoUnit"
],
"custom_conversion": {
"java.time.Duration": "java.time.TimeConversions",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json b/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
index a4ddd2ba..7d17a1d 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
@@ -2,7 +2,7 @@
"configuration_format_version": 5,
"group_id" : "com.tools.android",
"artifact_id" : "desugar_jdk_libs",
- "version": "1.2.1",
+ "version": "1.2.2",
"required_compilation_api_level": 30,
"synthesized_library_classes_package_prefix": "j$.",
"support_all_callbacks_from_library": true,
@@ -19,7 +19,8 @@
"java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar"
},
"wrapper_conversion": [
- "java.time.Clock"
+ "java.time.Clock",
+ "java.time.temporal.ChronoUnit"
],
"custom_conversion": {
"java.time.Duration": "java.time.TimeConversions",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
index 4128a53..db95ccf 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -34,7 +34,8 @@
"java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
},
"wrapper_conversion": [
- "java.time.Clock"
+ "java.time.Clock",
+ "java.time.temporal.ChronoUnit"
],
"custom_conversion": {
"java.time.Duration": "java.time.TimeConversions",
diff --git a/src/test/examplesJava9/timeunit/Example.java b/src/test/examplesJava9/timeunit/Example.java
new file mode 100644
index 0000000..09e1d0c
--- /dev/null
+++ b/src/test/examplesJava9/timeunit/Example.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package timeunit;
+
+import java.time.temporal.ChronoUnit;
+import java.util.concurrent.TimeUnit;
+
+public class Example {
+
+ public static void main(String[] args) {
+ TimeUnit timeUnit = TimeUnit.of(ChronoUnit.NANOS);
+ System.out.println(timeUnit.toChronoUnit());
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
index 102902a..8d84ddd 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassV2Test.java
@@ -66,7 +66,7 @@
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addInnerClasses(getClass())
.addKeepMainRule(Executor.class)
- .setMode(compilationMode)
+ .overrideCompilationMode(compilationMode)
.addOptionsModification(
options -> {
// Devirtualizing is correcting the invalid member-rebinding.
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
index 3737814..581a96c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
@@ -147,7 +147,7 @@
// TODO: parameterize to check both api<=23 as well as 23<api<26 for which the spec differs.
private final AndroidApiLevel minApi = AndroidApiLevel.B;
- private final AndroidApiLevel targetApi = AndroidApiLevel.S;
+ private final AndroidApiLevel targetApi = AndroidApiLevel.T;
private Set<String> getMissingGenericTypeConversions() {
HashSet<String> missing = new HashSet<>(MISSING_GENERIC_TYPE_CONVERSION);
@@ -407,6 +407,11 @@
indirectWrappers.computeIfAbsent(t, k -> new HashSet<>()).add(reference);
}
};
+ if (clazz.getAccessFlags().isEnum()) {
+ // Enum are not really wrapped, instead, each instance is converted to the matching
+ // instance, so there is no need to wrap indirect parameters and return types.
+ continue;
+ }
clazz.forAllVirtualMethods(
method -> {
assertTrue(method.toString(), method.isPublic() || method.isProtected());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java
new file mode 100644
index 0000000..54b3bc9
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java
@@ -0,0 +1,67 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
+
+import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm.Version;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
+import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
+import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class TimeUnitTest extends DesugaredLibraryTestBase {
+
+ private final TestParameters parameters;
+ private final LibraryDesugaringSpecification libraryDesugaringSpecification;
+ private final CompilationSpecification compilationSpecification;
+
+ private static final Path INPUT_JAR =
+ Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "timeunit.jar");
+ private static final String EXPECTED_OUTPUT = StringUtils.lines("Nanos");
+ private static final String MAIN_CLASS = "timeunit.Example";
+
+ @Parameters(name = "{0}, spec: {1}, {2}")
+ public static List<Object[]> data() {
+ return buildParameters(
+ getTestParameters()
+ .withDexRuntimesStartingFromIncluding(Version.V13_0_0)
+ .withApiLevel(AndroidApiLevel.B)
+ .build(),
+ getJdk8Jdk11(),
+ DEFAULT_SPECIFICATIONS);
+ }
+
+ public TimeUnitTest(
+ TestParameters parameters,
+ LibraryDesugaringSpecification libraryDesugaringSpecification,
+ CompilationSpecification compilationSpecification) {
+ this.parameters = parameters;
+ this.libraryDesugaringSpecification = libraryDesugaringSpecification;
+ this.compilationSpecification = compilationSpecification;
+ }
+
+ @Test
+ public void test() throws Exception {
+ testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
+ .addProgramFiles(INPUT_JAR)
+ .overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+ .addKeepMainRule(MAIN_CLASS)
+ .run(parameters.getRuntime(), MAIN_CLASS)
+ .assertSuccessWithOutput(EXPECTED_OUTPUT);
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index 46d0b73..380f2d5 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -48,6 +48,7 @@
private String l8ExtraKeepRules = "";
private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer();
private boolean l8FinalPrefixVerification = true;
+ private boolean overrideDefaultLibraryFiles = false;
private CustomLibrarySpecification customLibrarySpecification = null;
private TestingKeepRuleConsumer keepRuleConsumer = null;
@@ -67,7 +68,6 @@
private void setUp() {
builder
- .addLibraryFiles(libraryDesugaringSpecification.getLibraryFiles())
.setMinApi(parameters.getApiLevel())
.setMode(compilationSpecification.getProgramCompilationMode());
LibraryDesugaringTestConfiguration.Builder libraryConfBuilder =
@@ -149,6 +149,17 @@
return this;
}
+ /**
+ * By default the compilation uses as library libraryDesugaringSpecification.getLibraryFiles(),
+ * which is android.jar at the required compilation api level. Use this Api to set different
+ * library files.
+ */
+ public DesugaredLibraryTestBuilder<T> overrideLibraryFiles(Path... files) {
+ overrideDefaultLibraryFiles = true;
+ builder.addLibraryFiles(files);
+ return this;
+ }
+
public DesugaredLibraryTestBuilder<T> addProgramFiles(Collection<Path> files) {
builder.addProgramFiles(files);
return this;
@@ -165,7 +176,12 @@
return this;
}
- public DesugaredLibraryTestBuilder<T> setMode(CompilationMode mode) {
+ /**
+ * By default the compilation uses libraryDesugaringSpecification.getProgramCompilationMode()
+ * which maps to the studio set-up: D8-debug, D8-release and R8-release. Use this Api to set a
+ * different compilation mode.
+ */
+ public DesugaredLibraryTestBuilder<T> overrideCompilationMode(CompilationMode mode) {
builder.setMode(mode);
return this;
}
@@ -311,13 +327,22 @@
return this;
}
+ private void prepareCompilation() {
+ if (overrideDefaultLibraryFiles) {
+ return;
+ }
+ builder.addLibraryFiles(libraryDesugaringSpecification.getLibraryFiles());
+ }
+
public DesugaredLibraryTestCompileResult<T> compile() throws Exception {
+ prepareCompilation();
TestCompileResult<?, ? extends SingleTestRunResult<?>> compile = builder.compile();
return internalCompile(compile);
}
public DesugaredLibraryTestCompileResult<T> compileWithExpectedDiagnostics(
DiagnosticsConsumer consumer) throws Exception {
+ prepareCompilation();
TestCompileResult<?, ? extends SingleTestRunResult<?>> compile =
builder.compileWithExpectedDiagnostics(consumer);
return internalCompile(compile);