Add support for downloading kotlin dev compilers

Contents of README.google:
Name: Kotlin
URL: https://github.com/JetBrains/kotlin/
Version: 1.5.0
Revision: NA
License: Apache License Version 2.0

Bug: 200582899
Change-Id: I9285f3026c171ce4954166a19fb7de83cf6e2341
diff --git a/.gitignore b/.gitignore
index 080826a..7a9429b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -114,6 +114,8 @@
 third_party/kotlin/kotlin-compiler-1.4.20
 third_party/kotlin/kotlin-compiler-1.5.0.tar.gz
 third_party/kotlin/kotlin-compiler-1.5.0
+third_party/kotlin/kotlin-compiler-dev.tar.gz
+third_party/kotlin/kotlin-compiler-dev
 third_party/kotlinx-coroutines-1.3.6.tar.gz
 third_party/kotlinx-coroutines-1.3.6
 third_party/nest/*
diff --git a/third_party/kotlin/kotlin-compiler-dev.tar.gz.sha1 b/third_party/kotlin/kotlin-compiler-dev.tar.gz.sha1
new file mode 100644
index 0000000..9ff5928
--- /dev/null
+++ b/third_party/kotlin/kotlin-compiler-dev.tar.gz.sha1
@@ -0,0 +1 @@
+853bdb3640fd85a859d9baf3a972f71b037c5f8c
\ No newline at end of file
diff --git a/tools/download_kotlin_dev.py b/tools/download_kotlin_dev.py
new file mode 100755
index 0000000..c6c127e
--- /dev/null
+++ b/tools/download_kotlin_dev.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# Copyright (c) 2021, 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.
+
+from HTMLParser import HTMLParser
+import os
+import sys
+import urllib
+import utils
+
+JETBRAINS_KOTLIN_MAVEN_URL = "https://maven.pkg.jetbrains.space/kotlin/p/" \
+                             "kotlin/bootstrap/org/jetbrains/kotlin/"
+KOTLIN_RELEASE_URL = JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-compiler/"
+
+def download_newest():
+  response = urllib.urlopen(KOTLIN_RELEASE_URL)
+  if response.getcode() != 200:
+    raise Exception('Url: %s \n returned %s'
+                    % (KOTLIN_RELEASE_URL, response.getcode()))
+  content = response.read()
+  release_candidates = []
+
+  class HTMLContentParser(HTMLParser):
+    def handle_data(self, data):
+      if ('-dev-' in data):
+        release_candidates.append(data)
+
+  parser = HTMLContentParser()
+  parser.feed(content)
+
+  top_most_version = (0, 0, 0, 0)
+  top_most_version_and_build = None
+
+  for version in release_candidates:
+    # The compiler version is on the form <major>.<minor>.<revision>-dev-<build>/
+    version = version.replace('/', '')
+    version_build_args = version.split('-')
+    version_components = version_build_args[0].split('.')
+    version_components.append(version_build_args[2])
+    current_version = tuple(map(int, version_components))
+    if (current_version > top_most_version):
+      top_most_version = current_version
+      top_most_version_and_build = version
+
+  if (top_most_version_and_build is None):
+      raise Exception('Url: %s \n returned %s'
+                      % (KOTLIN_RELEASE_URL, response.getcode()))
+
+  # We can now download all files related to the kotlin compiler version.
+  print("Downloading version: " + top_most_version_and_build)
+
+  kotlinc_lib = os.path.join(
+      utils.THIRD_PARTY, "kotlin", "kotlin-compiler-dev", "kotlinc", "lib")
+
+  utils.DownloadFromGoogleCloudStorage(
+      os.path.join(
+          utils.THIRD_PARTY, "kotlin", "kotlin-compiler-dev.tar.gz.sha1"))
+
+  download_and_save(
+      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-compiler/{0}/kotlin-compiler-{0}.jar"
+      .format(top_most_version_and_build), kotlinc_lib, "kotlin-compiler.jar")
+  download_and_save(
+      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-stdlib/{0}/kotlin-stdlib-{0}.jar"
+      .format(top_most_version_and_build), kotlinc_lib, "kotlin-stdlib.jar")
+  download_and_save(
+      JETBRAINS_KOTLIN_MAVEN_URL + "kotlin-reflect/{0}/kotlin-reflect-{0}.jar"
+      .format(top_most_version_and_build), kotlinc_lib, "kotlin-reflect.jar")
+
+
+def download_and_save(url, path, name):
+  print('Downloading: ' + url)
+  urllib.urlretrieve(url, os.path.join(path, name))
+
+
+if __name__ == '__main__':
+  sys.exit(download_newest())
+
diff --git a/tools/test.py b/tools/test.py
index 6553358..c278251 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -8,6 +8,7 @@
 # force the tests to run, even if no input changed.
 
 import archive_desugar_jdk_libs
+import download_kotlin_dev
 import notify
 import optparse
 import os
@@ -187,6 +188,10 @@
       '--stacktrace',
       help='Pass --stacktrace to the gradle run',
       default=False, action='store_true')
+  result.add_option('--kotlin-dev-compiler',
+                    help='Specify to download a kotlin dev compiler and run '
+                         'tests with that',
+                    default=False, action='store_true')
   return result.parse_args()
 
 def archive_failures():
@@ -275,6 +280,8 @@
     gradle_args.append('-Pprint_full_stacktraces')
   if options.print_obfuscated_stacktraces:
     gradle_args.append('-Pprint_obfuscated_stacktraces')
+  if options.kotlin_dev_compiler:
+    download_kotlin_dev.download_newest()
   if os.name == 'nt':
     # temporary hack
     gradle_args.append('-Pno_internal')