Core lib descriptor, RC 2

Change-Id: I799286bfc59ec9a5d9321f2f61ff1b3306754818
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs.json b/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs.json
new file mode 100644
index 0000000..f43b696
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs.json
@@ -0,0 +1,141 @@
+{
+  "version": 1,
+  "required_compilation_api_level": 26,
+  "library_flags": [
+    {
+      "api_level_below_or_equal": 25,
+      "rewrite_prefix": {
+        "java.time.": "j$.time.",
+        "java.util.Desugar": "j$.util.Desugar"
+      },
+      "retarget_lib_member": {
+        "java.util.Calendar#toInstant": "java.util.DesugarCalendar",
+        "java.util.Date#from": "java.util.DesugarDate",
+        "java.util.Date#toInstant": "java.util.DesugarDate",
+        "java.util.GregorianCalendar#from": "java.util.DesugarGregorianCalendar",
+        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar"
+      },
+      "backport": {
+        "java.lang.Double8": "java.lang.Double",
+        "java.lang.Integer8": "java.lang.Integer",
+        "java.lang.Long8": "java.lang.Long",
+        "java.lang.Math8": "java.lang.Math"
+      }
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "rewrite_prefix": {
+        "java.util.stream.": "j$.util.stream.",
+        "java.util.function.": "j$.util.function.",
+        "java.util.Comparators": "j$.util.Comparators",
+        "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
+        "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
+        "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
+        "java.util.Objects": "j$.util.Objects",
+        "java.util.Optional": "j$.util.Optional",
+        "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
+        "java.util.SortedSet$1": "j$.util.SortedSet$1",
+        "java.util.Spliterator": "j$.util.Spliterator",
+        "java.util.StringJoiner": "j$.util.StringJoiner",
+        "java.util.Tripwire": "j$.util.Tripwire",
+        "java.util.concurrent.DesugarUnsafe": "j$.util.concurrent.DesugarUnsafe",
+        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
+        "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic"
+      },
+      "retarget_lib_member": {
+        "java.util.Arrays#stream": "java.util.DesugarArrays",
+        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
+        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet"
+      },
+      "dont_rewrite": [
+        "java.util.Iterator#remove"
+      ],
+      "emulate_interface": {
+        "java.util.Map$Entry": "j$.util.Map$Entry",
+        "java.util.Collection": "j$.util.Collection",
+        "java.util.Map": "j$.util.Map",
+        "java.util.Iterator": "j$.util.Iterator",
+        "java.util.Comparator": "j$.util.Comparator",
+        "java.util.List": "j$.util.List",
+        "java.util.SortedSet": "j$.util.SortedSet",
+        "java.util.Set": "j$.util.Set",
+        "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
+      }
+    },
+    {
+      "api_level_below_or_equal": 22,
+      "rewrite_prefix": {
+        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap"
+      }
+    }
+  ],
+  "program_flags": [
+    {
+      "api_level_below_or_equal": 25,
+      "rewrite_prefix": {
+        "java.time.": "j$.time.",
+        "java.util.Desugar": "j$.util.Desugar"
+      },
+      "retarget_lib_member": {
+        "java.util.Calendar#toInstant": "java.util.DesugarCalendar",
+        "java.util.Date#from": "java.util.DesugarDate",
+        "java.util.Date#toInstant": "java.util.DesugarDate",
+        "java.util.GregorianCalendar#from": "java.util.DesugarGregorianCalendar",
+        "java.util.GregorianCalendar#toZonedDateTime": "java.util.DesugarGregorianCalendar"
+      }
+    },
+    {
+      "api_level_below_or_equal": 23,
+      "rewrite_prefix": {
+        "java.util.stream.": "j$.util.stream.",
+        "java.util.function.": "j$.util.function.",
+        "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics",
+        "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics",
+        "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics",
+        "java.util.Optional": "j$.util.Optional",
+        "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator",
+        "java.util.Spliterator": "j$.util.Spliterator",
+        "java.util.StringJoiner": "j$.util.StringJoiner",
+        "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom",
+        "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic"
+      },
+      "retarget_lib_member": {
+        "java.util.Arrays#stream": "java.util.DesugarArrays",
+        "java.util.Arrays#spliterator": "java.util.DesugarArrays",
+        "java.util.LinkedHashSet#spliterator": "java.util.DesugarLinkedHashSet",
+        "java.util.concurrent.atomic.AtomicInteger#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.util.concurrent.atomic.AtomicInteger#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.util.concurrent.atomic.AtomicInteger#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.util.concurrent.atomic.AtomicInteger#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicInteger",
+        "java.util.concurrent.atomic.AtomicLong#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "java.util.concurrent.atomic.AtomicLong#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "java.util.concurrent.atomic.AtomicLong#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "java.util.concurrent.atomic.AtomicLong#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicLong",
+        "java.util.concurrent.atomic.AtomicReference#getAndUpdate": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.util.concurrent.atomic.AtomicReference#updateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.util.concurrent.atomic.AtomicReference#getAndAccumulate": "java.util.concurrent.atomic.DesugarAtomicReference",
+        "java.util.concurrent.atomic.AtomicReference#accumulateAndGet": "java.util.concurrent.atomic.DesugarAtomicReference"
+      },
+      "dont_rewrite": [
+        "java.util.Iterator#remove"
+      ],
+      "emulate_interface": {
+        "java.util.Map$Entry": "j$.util.Map$Entry",
+        "java.util.Collection": "j$.util.Collection",
+        "java.util.Map": "j$.util.Map",
+        "java.util.Iterator": "j$.util.Iterator",
+        "java.util.Comparator": "j$.util.Comparator",
+        "java.util.List": "j$.util.List",
+        "java.util.SortedSet": "j$.util.SortedSet",
+        "java.util.Set": "j$.util.Set",
+        "java.util.concurrent.ConcurrentMap": "j$.util.concurrent.ConcurrentMap"
+      }
+    },
+    {
+      "api_level_below_or_equal": 22,
+      "rewrite_prefix": {
+        "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap"
+      }
+    }
+  ]
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs_comments.md b/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs_comments.md
new file mode 100644
index 0000000..3e0a514
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/corelib/desugar_jdk_libs_comments.md
@@ -0,0 +1,33 @@
+# Description of the core library configuration file
+
+## Version
+
+The first field `version` encodes a versioning number internal to R8/D8 in the
+form of an unsigned integer. It allows R8/D8 to know if the file given is supported.
+Non-backward compatible changes to the desugared library increase the version number, and such
+library cannot be compiled without upgrading R8/D8 to the latest version.
+
+## Required compilation API level
+
+The second field `required_compilation_api_level` encodes the minimal Android API level required for
+the desugared library to be compiled correctly. If the API of library used for compilation of the
+library or a program using the library is lower than this level, one has to upgrade the SDK version
+used to be able to use desugared libraries.
+
+## Library and program flags
+
+The third and last fields are `library_flags` and `program_flags`. They include the set of flags
+required for respectively the library and the program using the desugared library compilation. The
+sets of flags are different depending on the min API level used. The flags are in a list, where
+each list entry specifies up to which min API level the set of flags should be applied. During
+compilation, R8/D8 adds up all the required flags for the min API level specified at compilation.
+
+For example, let's say the `program_flags` have entries for `api_level_below_or_equal` 20, 24 and 26.
+If compiling the program for min API 24, R8/D8 will use both the set of flags for API 24 and 26
+(24 <= 24, 24 <= 26 but !(24 <= 20)).
+
+## Copyright
+
+Copyright (c) 2019, 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.
\ No newline at end of file