Include custom conversion classes in desugar library configuration

The custom conversion classes are referenced from the configuration
(specified in the JSON file), and is now part of of the desugar
library configuration maven artifact.

Bug: 145393922
Change-Id: I8ebe654e177abed8ad05259774d360b09e8c76de
diff --git a/build.gradle b/build.gradle
index f825010..fba205d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -90,6 +90,12 @@
         }
         output.resourcesDir = 'build/classes/cfSegments'
     }
+    libraryDesugarConversions {
+        java {
+            srcDirs = ['src/library_desugar/java']
+        }
+        output.resourcesDir = 'build/classes/library_desugar_conversions'
+    }
     debugTestResources {
         java {
             srcDirs = ['src/test/debugTestResources']
@@ -852,7 +858,14 @@
     }
 }
 
-task testJar(type: ShadowJar, dependsOn: testClasses) {
+task buildLibraryDesugarConversions(type: Zip, dependsOn: downloadDeps) {
+    from sourceSets.libraryDesugarConversions.output
+    include "java/**/*.class"
+    baseName 'library_desugar_conversions'
+    destinationDir file('build/libs')
+}
+
+task testJar(type: ShadowJar, dependsOn: [testClasses, buildLibraryDesugarConversions]) {
     baseName = "r8tests"
     from sourceSets.test.output
     // We only want to include tests that use R8 when generating keep rules for applymapping.
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugar_jdk_libs.json b/src/library_desugar/desugar_jdk_libs.json
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugar_jdk_libs.json
rename to src/library_desugar/desugar_jdk_libs.json
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugar_jdk_libs_comments.md b/src/library_desugar/desugar_jdk_libs_comments.md
similarity index 100%
rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugar_jdk_libs_comments.md
rename to src/library_desugar/desugar_jdk_libs_comments.md
diff --git a/src/test/desugaredLibrary/stubs/timestubs/Duration.java b/src/library_desugar/java/j$/time/Duration.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/Duration.java
rename to src/library_desugar/java/j$/time/Duration.java
diff --git a/src/test/desugaredLibrary/stubs/timestubs/Instant.java b/src/library_desugar/java/j$/time/Instant.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/Instant.java
rename to src/library_desugar/java/j$/time/Instant.java
diff --git a/src/test/desugaredLibrary/stubs/timestubs/LocalDate.java b/src/library_desugar/java/j$/time/LocalDate.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/LocalDate.java
rename to src/library_desugar/java/j$/time/LocalDate.java
diff --git a/src/test/desugaredLibrary/stubs/timestubs/MonthDay.java b/src/library_desugar/java/j$/time/MonthDay.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/MonthDay.java
rename to src/library_desugar/java/j$/time/MonthDay.java
diff --git a/src/test/desugaredLibrary/stubs/timestubs/ZoneId.java b/src/library_desugar/java/j$/time/ZoneId.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/ZoneId.java
rename to src/library_desugar/java/j$/time/ZoneId.java
diff --git a/src/test/desugaredLibrary/stubs/timestubs/ZonedDateTime.java b/src/library_desugar/java/j$/time/ZonedDateTime.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/timestubs/ZonedDateTime.java
rename to src/library_desugar/java/j$/time/ZonedDateTime.java
diff --git a/src/test/desugaredLibrary/stubs/optionalstubs/Optional.java b/src/library_desugar/java/j$/util/optionalstubs/Optional.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/optionalstubs/Optional.java
rename to src/library_desugar/java/j$/util/optionalstubs/Optional.java
diff --git a/src/test/desugaredLibrary/stubs/optionalstubs/OptionalDouble.java b/src/library_desugar/java/j$/util/optionalstubs/OptionalDouble.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/optionalstubs/OptionalDouble.java
rename to src/library_desugar/java/j$/util/optionalstubs/OptionalDouble.java
diff --git a/src/test/desugaredLibrary/stubs/optionalstubs/OptionalInt.java b/src/library_desugar/java/j$/util/optionalstubs/OptionalInt.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/optionalstubs/OptionalInt.java
rename to src/library_desugar/java/j$/util/optionalstubs/OptionalInt.java
diff --git a/src/test/desugaredLibrary/stubs/optionalstubs/OptionalLong.java b/src/library_desugar/java/j$/util/optionalstubs/OptionalLong.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/optionalstubs/OptionalLong.java
rename to src/library_desugar/java/j$/util/optionalstubs/OptionalLong.java
diff --git a/src/test/desugaredLibrary/stubs/summarystatisticsstubs/DoubleSummaryStatistics.java b/src/library_desugar/java/j$/util/summarystatisticsstubs/DoubleSummaryStatistics.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/summarystatisticsstubs/DoubleSummaryStatistics.java
rename to src/library_desugar/java/j$/util/summarystatisticsstubs/DoubleSummaryStatistics.java
diff --git a/src/test/desugaredLibrary/stubs/summarystatisticsstubs/IntSummaryStatistics.java b/src/library_desugar/java/j$/util/summarystatisticsstubs/IntSummaryStatistics.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/summarystatisticsstubs/IntSummaryStatistics.java
rename to src/library_desugar/java/j$/util/summarystatisticsstubs/IntSummaryStatistics.java
diff --git a/src/test/desugaredLibrary/stubs/summarystatisticsstubs/LongSummaryStatistics.java b/src/library_desugar/java/j$/util/summarystatisticsstubs/LongSummaryStatistics.java
similarity index 100%
rename from src/test/desugaredLibrary/stubs/summarystatisticsstubs/LongSummaryStatistics.java
rename to src/library_desugar/java/j$/util/summarystatisticsstubs/LongSummaryStatistics.java
diff --git a/src/test/desugaredLibrary/conversions/TimeConversions.java b/src/library_desugar/java/java/time/TimeConversions.java
similarity index 100%
rename from src/test/desugaredLibrary/conversions/TimeConversions.java
rename to src/library_desugar/java/java/time/TimeConversions.java
diff --git a/src/test/desugaredLibrary/conversions/DoubleSummaryStatisticsConversions.java b/src/library_desugar/java/java/util/DoubleSummaryStatisticsConversions.java
similarity index 100%
rename from src/test/desugaredLibrary/conversions/DoubleSummaryStatisticsConversions.java
rename to src/library_desugar/java/java/util/DoubleSummaryStatisticsConversions.java
diff --git a/src/test/desugaredLibrary/conversions/IntSummaryStatisticsConversions.java b/src/library_desugar/java/java/util/IntSummaryStatisticsConversions.java
similarity index 100%
rename from src/test/desugaredLibrary/conversions/IntSummaryStatisticsConversions.java
rename to src/library_desugar/java/java/util/IntSummaryStatisticsConversions.java
diff --git a/src/test/desugaredLibrary/conversions/LongSummaryStatisticsConversions.java b/src/library_desugar/java/java/util/LongSummaryStatisticsConversions.java
similarity index 100%
rename from src/test/desugaredLibrary/conversions/LongSummaryStatisticsConversions.java
rename to src/library_desugar/java/java/util/LongSummaryStatisticsConversions.java
diff --git a/src/test/desugaredLibrary/conversions/OptionalConversions.java b/src/library_desugar/java/java/util/OptionalConversions.java
similarity index 100%
rename from src/test/desugaredLibrary/conversions/OptionalConversions.java
rename to src/library_desugar/java/java/util/OptionalConversions.java
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 51d0276..c0a5ee0 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -167,9 +167,10 @@
       Paths.get(LIBS_DIR, "r8lib-exclude-deps.jar.map");
   public static final Path DEPS_NOT_RELOCATED = Paths.get(LIBS_DIR, "deps-not-relocated.jar");
 
+  public static final Path DESUGAR_LIB_CONVERSIONS =
+      Paths.get(LIBS_DIR, "library_desugar_conversions.zip");
   public static final Path DESUGAR_LIB_JSON_FOR_TESTING =
-      Paths.get(
-          "src/test/java/com/android/tools/r8/desugar/desugaredlibrary/desugar_jdk_libs.json");
+      Paths.get("src/library_desugar/desugar_jdk_libs.json");
 
   public static boolean isLocalDevelopment() {
     return System.getProperty("local_development", "0").equals("1");
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index fd59825..17b2a61 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -16,8 +16,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestRuntime;
-import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.origin.Origin;
@@ -26,55 +24,12 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
-import org.junit.Assume;
 
 public class DesugaredLibraryTestBase extends TestBase {
 
-  private static final Path CONVERSION_FOLDER = Paths.get("src/test/desugaredLibrary");
-  private Path[] conversions;
-
-  public Path[] computeOrGetConversionClasses() {
-    if (conversions != null) {
-      return conversions;
-    }
-    Assume.assumeTrue(
-        "JDK8 javac is required to avoid dealing with modules and JDK8 is not checked-in on"
-            + " windows",
-        !ToolHelper.isWindows());
-    try {
-      CfRuntime runtime = TestRuntime.getCheckedInJdk8();
-      Path conversionFolder = temp.newFolder("conversions").toPath();
-
-      // Compile the stubs to be able to compile the conversions.
-      Path stubsJar =
-          javac(runtime)
-              .addSourceFiles(
-                  getAllFilesWithSuffixInDirectory(CONVERSION_FOLDER.resolve("stubs"), "java"))
-              .compile();
-
-      // Compile the conversions using the stubs.
-      javac(runtime)
-          .setOutputPath(conversionFolder)
-          .addClasspathFiles(stubsJar)
-          .addSourceFiles(
-              getAllFilesWithSuffixInDirectory(CONVERSION_FOLDER.resolve("conversions"), "java"))
-          .compile();
-
-      conversions = getAllFilesWithSuffixInDirectory(conversionFolder, "class");
-      assert conversions.length > 0
-          : "Something went wrong during compilation, check the runJavac return value for"
-              + " debugging.";
-      return conversions;
-    } catch (IOException e) {
-      throw new Error(e);
-    }
-  }
-
   protected boolean requiresEmulatedInterfaceCoreLibDesugaring(TestParameters parameters) {
     return parameters.getApiLevel().getLevel() < AndroidApiLevel.N.getLevel();
   }
@@ -107,13 +62,13 @@
       // This implies that extra warning are generated if this is set.
       boolean disableL8AnnotationRemovalForTesting = !additionalProgramFiles.isEmpty();
       ArrayList<Path> extraPaths = new ArrayList<>(additionalProgramFiles);
-      Collections.addAll(extraPaths, computeOrGetConversionClasses());
       TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
       Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip");
       L8Command.Builder l8Builder =
           L8Command.builder(diagnosticsHandler)
               .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
               .addProgramFiles(ToolHelper.getDesugarJDKLibs())
+              .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
               .setMode(shrink ? CompilationMode.RELEASE : CompilationMode.DEBUG)
               .addProgramFiles(extraPaths)
               .addDesugaredLibraryConfiguration(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicTimeConversionTest.java
index a5b0176..1e66f26 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/BasicTimeConversionTest.java
@@ -35,7 +35,7 @@
     L8Command.Builder l8Builder =
         L8Command.builder(diagnosticsHandler)
             .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
-            .addProgramFiles(computeOrGetConversionClasses())
+            .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
             .addDesugaredLibraryConfiguration(
                 StringResource.fromFile(ToolHelper.DESUGAR_LIB_JSON_FOR_TESTING))
             .setMinApiLevel(AndroidApiLevel.B.getLevel())
diff --git a/tools/archive.py b/tools/archive.py
index ff0f3db..c24babb 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -140,6 +140,7 @@
     utils.D8,
     utils.R8LIB,
     utils.R8LIB_NO_DEPS,
+    utils.LIBRARY_DESUGAR_CONVERSIONS,
     '-Pno_internal'
   ])
 
@@ -235,7 +236,9 @@
         with utils.TempDir() as tmp_dir:
           desugar_jdk_libs_configuration_jar = os.path.join(tmp_dir, jar_name)
           create_maven_release.generate_jar_with_desugar_configuration(
-              utils.DESUGAR_CONFIGURATION, desugar_jdk_libs_configuration_jar)
+              utils.DESUGAR_CONFIGURATION,
+              utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP,
+              desugar_jdk_libs_configuration_jar)
 
           if options.dry_run:
             print('Dry run, not actually creating maven repo for '
diff --git a/tools/create_maven_release.py b/tools/create_maven_release.py
index 72186a8..cc36693 100755
--- a/tools/create_maven_release.py
+++ b/tools/create_maven_release.py
@@ -16,6 +16,7 @@
 from string import Template
 import tempfile
 import utils
+import zipfile
 
 DEPENDENCYTEMPLATE = Template(
 """
@@ -333,16 +334,29 @@
       out)
 
 # Write the desugaring configuration of a jar file with the following content:
-#  META-INF
-#    desugar
-#      d8
+#  java/
+#    util/
+#      <java.util conversions classes>
+#    time/
+#      <java.time conversions classes>
+#  META-INF/
+#    desugar/
+#      d8/
 #        desugar.json
-def generate_jar_with_desugar_configuration(configuration, destination):
+#        lint/
+#          <lint files>
+def generate_jar_with_desugar_configuration(configuration, conversions, destination):
   with utils.TempDir() as tmp_dir:
+    # Add conversion classes.
+    with zipfile.ZipFile(conversions, 'r') as conversions_zip:
+      conversions_zip.extractall(tmp_dir)
+
+    # Add configuration
     configuration_dir = join(tmp_dir, 'META-INF', 'desugar', 'd8')
     makedirs(configuration_dir)
     copyfile(configuration, join(configuration_dir, 'desugar.json'))
 
+    # Add lint configuartion.
     lint_dir = join(configuration_dir, 'lint')
     makedirs(lint_dir)
     cmd = [
@@ -367,7 +381,9 @@
   # Generate the jar with the configuration file.
   jar_file = 'desugar_configuration.jar'
   generate_jar_with_desugar_configuration(
-      utils.DESUGAR_CONFIGURATION, jar_file)
+      utils.DESUGAR_CONFIGURATION,
+      utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP,
+      jar_file)
   # Write the maven zip file.
   generate_maven_zip(
       'desugar_jdk_libs_configuration', version, pom_file, jar_file, out)
diff --git a/tools/utils.py b/tools/utils.py
index 15a9dd9..3178d16 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -41,6 +41,7 @@
 R8LIB = 'r8lib'
 R8LIB_NO_DEPS = 'r8LibNoDeps'
 R8_SRC = 'sourceJar'
+LIBRARY_DESUGAR_CONVERSIONS = 'buildLibraryDesugarConversions'
 
 D8_JAR = os.path.join(LIBS, 'd8.jar')
 R8_JAR = os.path.join(LIBS, 'r8.jar')
@@ -50,16 +51,10 @@
 R8_FULL_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8-full-exclude-deps.jar')
 MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
 MAVEN_ZIP_LIB = os.path.join(LIBS, 'r8lib.zip')
-# TODO(b/134732760): The JSON configuration should be moved.
+LIBRARY_DESUGAR_CONVERSIONS_ZIP = os.path.join(LIBS, 'library_desugar_conversions.zip')
+
 DESUGAR_CONFIGURATION = os.path.join(
-      TEST_ROOT,
-      'com',
-      'android',
-      'tools',
-      'r8',
-      'desugar',
-      'desugaredlibrary',
-      'desugar_jdk_libs.json')
+      SRC_ROOT, 'library_desugar', 'desugar_jdk_libs.json')
 DESUGAR_CONFIGURATION_MAVEN_ZIP = os.path.join(
   LIBS, 'desugar_jdk_libs_configuration.zip')
 GENERATED_LICENSE = os.path.join(GENERATED_LICENSE_DIR, 'LICENSE')