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;
+    }
   }
 }