Update desugared library conversion to Android U
Change-Id: Icc55e4f05a71a2d660858a9970ffee22ab11f6be
diff --git a/src/library_desugar/desugar_jdk_libs.json b/src/library_desugar/desugar_jdk_libs.json
index 6f57d4c..795458a 100644
--- a/src/library_desugar/desugar_jdk_libs.json
+++ b/src/library_desugar/desugar_jdk_libs.json
@@ -87,11 +87,13 @@
"java.time.Duration": "java.time.TimeConversions",
"java.time.Instant": "java.time.TimeConversions",
"java.time.LocalDate": "java.time.TimeConversions",
+ "java.time.LocalDateTime": "java.time.TimeConversions",
"java.time.LocalTime": "java.time.TimeConversions",
"java.time.MonthDay": "java.time.TimeConversions",
"java.time.Period": "java.time.TimeConversions",
"java.time.ZoneId": "java.time.TimeConversions",
- "java.time.ZonedDateTime": "java.time.TimeConversions"
+ "java.time.ZonedDateTime": "java.time.TimeConversions",
+ "java.time.ZoneOffset": "java.time.TimeConversions"
}
},
{
@@ -170,11 +172,13 @@
"java.time.Duration": "java.time.TimeConversions",
"java.time.Instant": "java.time.TimeConversions",
"java.time.LocalDate": "java.time.TimeConversions",
+ "java.time.LocalDateTime": "java.time.TimeConversions",
"java.time.LocalTime": "java.time.TimeConversions",
"java.time.MonthDay": "java.time.TimeConversions",
"java.time.Period": "java.time.TimeConversions",
"java.time.ZoneId": "java.time.TimeConversions",
- "java.time.ZonedDateTime": "java.time.TimeConversions"
+ "java.time.ZonedDateTime": "java.time.TimeConversions",
+ "java.time.ZoneOffset": "java.time.TimeConversions"
}
},
{
diff --git a/src/library_desugar/java/j$/time/LocalDateTime.java b/src/library_desugar/java/j$/time/LocalDateTime.java
new file mode 100644
index 0000000..04ed5af
--- /dev/null
+++ b/src/library_desugar/java/j$/time/LocalDateTime.java
@@ -0,0 +1,40 @@
+// Copyright (c) 2023, 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 j$.time;
+
+public class LocalDateTime {
+ public static LocalDateTime of(
+ int year, int month, int dayOfMonth, int hour, int minute, int second, int nano) {
+ return null;
+ }
+
+ public int getYear() {
+ return 0;
+ }
+
+ public int getMonthValue() {
+ return 0;
+ }
+
+ public int getDayOfMonth() {
+ return 0;
+ }
+
+ public int getHour() {
+ return 0;
+ }
+
+ public int getMinute() {
+ return 0;
+ }
+
+ public int getSecond() {
+ return 0;
+ }
+
+ public int getNano() {
+ return 0;
+ }
+}
diff --git a/src/library_desugar/java/j$/time/ZoneOffset.java b/src/library_desugar/java/j$/time/ZoneOffset.java
new file mode 100644
index 0000000..aef3e85
--- /dev/null
+++ b/src/library_desugar/java/j$/time/ZoneOffset.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2023, 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 j$.time;
+
+public class ZoneOffset {
+
+ public static ZoneOffset of(String id) {
+ return null;
+ }
+
+ public String getId() {
+ return null;
+ }
+}
diff --git a/src/library_desugar/java/java/time/TimeConversions.java b/src/library_desugar/java/java/time/TimeConversions.java
index 80824df..1bfd1d9 100644
--- a/src/library_desugar/java/java/time/TimeConversions.java
+++ b/src/library_desugar/java/java/time/TimeConversions.java
@@ -8,6 +8,49 @@
private TimeConversions() {}
+ public static j$.time.ZoneOffset convert(java.time.ZoneOffset offset) {
+ if (offset == null) {
+ return null;
+ }
+ return j$.time.ZoneOffset.of(offset.getId());
+ }
+
+ public static java.time.ZoneOffset convert(j$.time.ZoneOffset offset) {
+ if (offset == null) {
+ return null;
+ }
+ return java.time.ZoneOffset.of(offset.getId());
+ }
+
+ public static j$.time.LocalDateTime convert(java.time.LocalDateTime localDateTime) {
+ if (localDateTime == null) {
+ return null;
+ }
+ return j$.time.LocalDateTime.of(
+ localDateTime.getYear(),
+ localDateTime.getMonthValue(),
+ localDateTime.getDayOfMonth(),
+ localDateTime.getHour(),
+ localDateTime.getMinute(),
+ localDateTime.getSecond(),
+ localDateTime.getNano());
+ }
+
+ public static java.time.LocalDateTime convert(j$.time.LocalDateTime localDateTime) {
+ if (localDateTime == null) {
+ return null;
+ }
+
+ return java.time.LocalDateTime.of(
+ localDateTime.getYear(),
+ localDateTime.getMonthValue(),
+ localDateTime.getDayOfMonth(),
+ localDateTime.getHour(),
+ localDateTime.getMinute(),
+ localDateTime.getSecond(),
+ localDateTime.getNano());
+ }
+
public static j$.time.Period convert(java.time.Period period) {
if (period == null) {
return null;
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 15cf883..0180c03 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -142,6 +142,9 @@
"java.time.": "j$.time.",
"java.util.Desugar": "j$.util.Desugar"
},
+ "dont_rewrite_prefix": [
+ "java.time.InstantSource"
+ ],
"retarget_method": {
"java.util.TimeZone java.util.TimeZone#getTimeZone(java.time.ZoneId)": "java.util.DesugarTimeZone"
},
@@ -157,11 +160,13 @@
"java.time.Duration": "java.time.TimeConversions",
"java.time.Instant": "java.time.TimeConversions",
"java.time.LocalDate": "java.time.TimeConversions",
+ "java.time.LocalDateTime": "java.time.TimeConversions",
"java.time.LocalTime": "java.time.TimeConversions",
"java.time.MonthDay": "java.time.TimeConversions",
"java.time.Period": "java.time.TimeConversions",
"java.time.ZoneId": "java.time.TimeConversions",
- "java.time.ZonedDateTime": "java.time.TimeConversions"
+ "java.time.ZonedDateTime": "java.time.TimeConversions",
+ "java.time.ZoneOffset": "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 7a72f81..3d603c1 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
@@ -70,11 +70,13 @@
"java.time.Duration": "java.time.TimeConversions",
"java.time.Instant": "java.time.TimeConversions",
"java.time.LocalDate": "java.time.TimeConversions",
+ "java.time.LocalDateTime": "java.time.TimeConversions",
"java.time.LocalTime": "java.time.TimeConversions",
"java.time.MonthDay": "java.time.TimeConversions",
"java.time.Period": "java.time.TimeConversions",
"java.time.ZoneId": "java.time.TimeConversions",
- "java.time.ZonedDateTime": "java.time.TimeConversions"
+ "java.time.ZonedDateTime": "java.time.TimeConversions",
+ "java.time.ZoneOffset": "java.time.TimeConversions"
}
},
{
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index 8d8c7a4..787243a 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -167,6 +167,9 @@
"java.time.": "j$.time.",
"java.util.Desugar": "j$.util.Desugar"
},
+ "dont_rewrite_prefix": [
+ "java.time.InstantSource"
+ ],
"retarget_method": {
"java.util.TimeZone java.util.TimeZone#getTimeZone(java.time.ZoneId)": "java.util.DesugarTimeZone"
},
@@ -182,11 +185,13 @@
"java.time.Duration": "java.time.TimeConversions",
"java.time.Instant": "java.time.TimeConversions",
"java.time.LocalDate": "java.time.TimeConversions",
+ "java.time.LocalDateTime": "java.time.TimeConversions",
"java.time.LocalTime": "java.time.TimeConversions",
"java.time.MonthDay": "java.time.TimeConversions",
"java.time.Period": "java.time.TimeConversions",
"java.time.ZoneId": "java.time.TimeConversions",
- "java.time.ZonedDateTime": "java.time.TimeConversions"
+ "java.time.ZonedDateTime": "java.time.TimeConversions",
+ "java.time.ZoneOffset": "java.time.TimeConversions"
}
},
{
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 a6a0535..2b5de3f 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
@@ -74,6 +74,9 @@
// needing wrappers and this is the exclusion set.
private static final Set<String> NOT_NEEDED =
ImmutableSet.of(
+ "java.time.InstantSource", // Introduced after Java 11.
+ "java.util.HexFormat",
+ "java.util.Locale$IsoCountryCode",
"java.nio.channels.AsynchronousByteChannel",
"java.nio.channels.AsynchronousChannelGroup",
"java.nio.channels.AsynchronousServerSocketChannel",
@@ -119,6 +122,13 @@
+ " java.util.stream.Stream.flatMapToLong(java.util.function.Function)",
"java.util.stream.LongStream"
+ " java.util.stream.LongStream.flatMap(java.util.function.LongFunction)",
+ "java.util.stream.DoubleStream"
+ + " java.util.stream.Stream.mapMultiToDouble(java.util.function.BiConsumer)",
+ "java.util.stream.Stream java.util.stream.Stream.mapMulti(java.util.function.BiConsumer)",
+ "java.util.stream.IntStream"
+ + " java.util.stream.Stream.mapMultiToInt(java.util.function.BiConsumer)",
+ "java.util.stream.LongStream"
+ + " java.util.stream.Stream.mapMultiToLong(java.util.function.BiConsumer)",
"java.lang.Object java.lang.StackWalker.walk(java.util.function.Function)");
// TODO(b/238179854): Investigate how to fix these.
@@ -159,7 +169,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.MASTER;
+ private final AndroidApiLevel targetApi = AndroidApiLevel.U;
private Set<String> getMissingGenericTypeConversions() {
HashSet<String> missing = new HashSet<>(MISSING_GENERIC_TYPE_CONVERSION);
@@ -281,21 +291,6 @@
specification.getWrappers(),
genericConversionsInSpec,
genericDependencies);
- {
- Set<String> missingGenericDependency = new HashSet<>();
- for (DexEncodedMethod genericDependency : genericDependencies) {
- if (!specification
- .getApiGenericConversion()
- .containsKey(genericDependency.getReference())) {
- missingGenericDependency.add(genericDependency.getReference().toString());
- }
- }
- // TODO(b/236356665): There should be no missing conversion.
- assertEquals(
- "Missing generic type conversion:\n" + String.join("\n", missingGenericDependency),
- getMissingGenericTypeConversions(),
- missingGenericDependency);
- }
{
Set<String> missingWrappers = getMissingWrappers(directWrappers, wrappersInSpec);
@@ -320,6 +315,25 @@
missingWrappers.size());
}
+ {
+ Set<String> missingGenericDependency = new HashSet<>();
+ for (DexEncodedMethod genericDependency : genericDependencies) {
+ if (!specification
+ .getApiGenericConversion()
+ .containsKey(genericDependency.getReference())) {
+ missingGenericDependency.add(genericDependency.getReference().toString());
+ }
+ }
+ Set<String> diff = new HashSet<>(missingGenericDependency);
+ Set<String> missing = getMissingGenericTypeConversions();
+ diff.removeAll(missing);
+ // TODO(b/236356665): There should be no missing conversion.
+ assertEquals(
+ "Missing generic type conversion:\n" + String.join("\n", diff),
+ missing,
+ missingGenericDependency);
+ }
+
Set<String> additionalWrappers = new TreeSet<>();
for (String wrapper : wrappersInSpec) {
ClassReference item = Reference.classFromTypeName(wrapper);
@@ -375,10 +389,15 @@
return;
}
Consumer<ClassReference> adder =
- t ->
- directWrappers
- .computeIfAbsent(t, k -> new HashSet<>())
- .add(method.asMethodReference());
+ t -> {
+ if (t.toString().contains("HexFormat")
+ || t.toString().contains("IsoCountryCode")) {
+ System.out.println("x");
+ }
+ directWrappers
+ .computeIfAbsent(t, k -> new HashSet<>())
+ .add(method.asMethodReference());
+ };
forEachType(
method,
t -> addType(adder, t, preDesugarTypes, customConversions, maintainType),
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/LocalTimePeriodConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TimeConversionTest.java
similarity index 82%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/LocalTimePeriodConversionTest.java
rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TimeConversionTest.java
index 2dbc3d8..73f7d1b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/LocalTimePeriodConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TimeConversionTest.java
@@ -1,4 +1,4 @@
-// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2023, 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.
@@ -15,8 +15,11 @@
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.ImmutableList;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
+import java.time.ZoneOffset;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -24,14 +27,15 @@
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
-public class LocalTimePeriodConversionTest extends DesugaredLibraryTestBase {
+public class TimeConversionTest extends DesugaredLibraryTestBase {
private final TestParameters parameters;
private final LibraryDesugaringSpecification libraryDesugaringSpecification;
private final CompilationSpecification compilationSpecification;
private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O;
- private static final String EXPECTED_RESULT = StringUtils.lines("00:00", "P0D");
+ private static final String EXPECTED_RESULT =
+ StringUtils.lines("00:00", "P0D", "0001-01-01T00:00", "Z");
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
@@ -41,7 +45,7 @@
DEFAULT_SPECIFICATIONS);
}
- public LocalTimePeriodConversionTest(
+ public TimeConversionTest(
TestParameters parameters,
LibraryDesugaringSpecification libraryDesugaringSpecification,
CompilationSpecification compilationSpecification) {
@@ -67,6 +71,9 @@
public static void main(String[] args) {
System.out.println(CustomLibClass.get(LocalTime.MIDNIGHT));
System.out.println(CustomLibClass.get(Period.ZERO));
+ System.out.println(
+ CustomLibClass.get(LocalDateTime.of(LocalDate.of(1, 1, 1), LocalTime.MIDNIGHT)));
+ System.out.println(CustomLibClass.get(ZoneOffset.UTC));
}
}
@@ -82,5 +89,13 @@
public static Period get(Period period) {
return period;
}
+
+ public static LocalDateTime get(LocalDateTime ldt) {
+ return ldt;
+ }
+
+ public static ZoneOffset get(ZoneOffset zo) {
+ return zo;
+ }
}
}