Extend KotlinCompilerTool to use a specific kotlin compiler version

Change-Id: Ia037097d836f9625b001532eab9ba8df5a5327d1
diff --git a/src/test/java/com/android/tools/r8/KotlinCompilerTool.java b/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
index 90763af..2b6cd3c 100644
--- a/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
+++ b/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
@@ -3,19 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import static com.android.tools.r8.ToolHelper.KT_COMPILER;
-import static com.android.tools.r8.ToolHelper.KT_PRELOADER;
 import static com.android.tools.r8.ToolHelper.isWindows;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestRuntime.CfRuntime;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.utils.FileUtils;
 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.Collection;
@@ -25,32 +25,59 @@
 
 public class KotlinCompilerTool {
 
+  public static final class KotlinCompiler {
+
+    private final String name;
+    private final Path path;
+
+    public KotlinCompiler(String name, Path path) {
+      this.name = name;
+      this.path = path;
+    }
+
+    public Path getPath() {
+      return path;
+    }
+  }
+
+  public static KotlinCompiler KOTLINC =
+      new KotlinCompiler(
+          "kotlinc",
+          Paths.get(ToolHelper.THIRD_PARTY_DIR, "kotlin", "kotlinc", "lib", "kotlin-compiler.jar"));
+
   private final CfRuntime jdk;
   private final TestState state;
-  private final String kotlincJar;
+  private final KotlinCompiler compiler;
+  private final KotlinTargetVersion targetVersion;
   private final List<Path> sources = new ArrayList<>();
   private final List<Path> classpath = new ArrayList<>();
   private Path output = null;
 
-  private KotlinCompilerTool(CfRuntime jdk, TestState state, Path kotlincJar) {
+  private KotlinCompilerTool(
+      CfRuntime jdk, TestState state, KotlinCompiler compiler, KotlinTargetVersion targetVersion) {
     this.jdk = jdk;
     this.state = state;
-    this.kotlincJar = kotlincJar == null ? KT_COMPILER : kotlincJar.toString();
+    this.compiler = compiler;
+    this.targetVersion = targetVersion;
   }
 
-  public static KotlinCompilerTool create(CfRuntime jdk, TemporaryFolder temp) {
-    return create(jdk, new TestState(temp), null);
+  public static KotlinCompilerTool create(
+      CfRuntime jdk,
+      TemporaryFolder temp,
+      KotlinCompiler kotlinCompiler,
+      KotlinTargetVersion kotlinTargetVersion) {
+    return create(jdk, new TestState(temp), kotlinCompiler, kotlinTargetVersion);
   }
 
-  public static KotlinCompilerTool create (CfRuntime jdk, TemporaryFolder temp, Path kotlincJar) {
-    return create(jdk, new TestState(temp), kotlincJar);
+  public static KotlinCompilerTool create(
+      CfRuntime jdk,
+      TestState state,
+      KotlinCompiler kotlinCompiler,
+      KotlinTargetVersion kotlinTargetVersion) {
+    return new KotlinCompilerTool(jdk, state, kotlinCompiler, kotlinTargetVersion);
   }
 
-  public static KotlinCompilerTool create(CfRuntime jdk, TestState state, Path kotlincJar) {
-    return new KotlinCompilerTool(jdk, state, kotlincJar);
-  }
-
-  public KotlinCompilerTool addSourceFiles(Path files) {
+  public KotlinCompilerTool addSourceFiles(Path... files) {
     return addSourceFiles(Arrays.asList(files));
   }
 
@@ -77,9 +104,7 @@
   }
 
   private Path getOrCreateOutputPath() throws IOException {
-    return output != null
-        ? output
-        : state.getNewTempFolder().resolve("out.jar");
+    return output != null ? output : state.getNewTempFolder().resolve("out.jar");
   }
 
   /** Compile and return the compilations process result object. */
@@ -99,12 +124,13 @@
   private ProcessResult compileInternal(Path output) throws IOException {
     List<String> cmdline = new ArrayList<>();
     cmdline.add(jdk.getJavaExecutable().toString());
-    cmdline.add("-jar");
-    cmdline.add(KT_PRELOADER);
-    cmdline.add("org.jetbrains.kotlin.preloading.Preloader");
     cmdline.add("-cp");
-    cmdline.add(kotlincJar);
+    cmdline.add(compiler.getPath().toString());
     cmdline.add(ToolHelper.K2JVMCompiler);
+    cmdline.add("-jdk-home");
+    cmdline.add(jdk.getJavaHome().toString());
+    cmdline.add("-jvm-target");
+    cmdline.add(targetVersion.getJvmTargetString());
     for (Path source : sources) {
       cmdline.add(source.toString());
     }
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 023e0e7..57eae6b 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -11,9 +11,11 @@
 
 import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
 import com.android.tools.r8.DataResourceProvider.Visitor;
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.code.Instruction;
 import com.android.tools.r8.dex.ApplicationReader;
@@ -206,16 +208,9 @@
     return JavaCompilerTool.create(jdk, temp);
   }
 
-  public KotlinCompilerTool kotlinc(CfRuntime jdk) {
-    return KotlinCompilerTool.create(jdk, temp);
-  }
-
-  public KotlinCompilerTool kotlinc(CfRuntime jdk, Path kotlincJar) {
-    return KotlinCompilerTool.create(jdk, temp, kotlincJar);
-  }
-
-  public static KotlinCompilerTool kotlinc(CfRuntime jdk, TemporaryFolder temp) {
-    return KotlinCompilerTool.create(jdk, temp);
+  public KotlinCompilerTool kotlinc(
+      CfRuntime jdk, KotlinCompiler kotlinCompiler, KotlinTargetVersion kotlinTargetVersion) {
+    return KotlinCompilerTool.create(jdk, temp, kotlinCompiler, kotlinTargetVersion);
   }
 
   public static ClassFileTransformer transformer(Class<?> clazz) throws IOException {
@@ -1365,4 +1360,22 @@
   public JarBuilder jarBuilder() throws IOException {
     return JarBuilder.builder(temp);
   }
+
+  public Collection<Path> buildOnDexRuntime(TestParameters parameters, Collection<Path> paths)
+      throws CompilationFailedException, IOException {
+    if (parameters.isCfRuntime()) {
+      return paths;
+    }
+    return Collections.singletonList(
+        testForD8()
+            .addProgramFiles(paths)
+            .setMinApi(parameters.getApiLevel())
+            .compile()
+            .writeToZip());
+  }
+
+  public Collection<Path> buildOnDexRuntime(TestParameters parameters, Path... paths)
+      throws IOException, CompilationFailedException {
+    return buildOnDexRuntime(parameters, Arrays.asList(paths));
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 64c32a0..51d0276 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.ToolHelper.DexVm.Kind;
 import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AssemblyWriter;
 import com.android.tools.r8.graph.DexApplication;
@@ -73,6 +74,7 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import java.util.zip.CRC32;
 import org.junit.Assert;
 import org.junit.Assume;
@@ -2065,6 +2067,17 @@
     public String getFolderName() {
       return folderName;
     }
+
+    public String getJvmTargetString() {
+      switch (this) {
+        case JAVA_6:
+          return "1.6";
+        case JAVA_8:
+          return "1.8";
+        default:
+          throw new Unimplemented("JvmTarget not specified for " + this);
+      }
+    }
   }
 
   public static void disassemble(AndroidApp app, PrintStream ps)
@@ -2073,4 +2086,20 @@
         new ApplicationReader(app, new InternalOptions(), new Timing()).read().toDirect();
     new AssemblyWriter(application, new InternalOptions(), true, false).write(ps);
   }
+
+  public static Path getTestFolderForClass(Class<?> clazz) {
+    return Paths.get(ToolHelper.TESTS_DIR)
+        .resolve("java")
+        .resolve(ToolHelper.getFileNameForTestClass(clazz))
+        .getParent();
+  }
+
+  public static Collection<Path> getFilesInTestFolderRelativeToClass(
+      Class<?> clazz, String folderName, String endsWith) throws IOException {
+    Path subFolder = getTestFolderForClass(clazz).resolve(folderName);
+    assert Files.isDirectory(subFolder);
+    try (Stream<Path> walker = Files.walk(subFolder)) {
+      return walker.filter(path -> path.toString().endsWith(endsWith)).collect(Collectors.toList());
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/KotlinCompilerTreeShakingTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/KotlinCompilerTreeShakingTest.java
index 1a941d5..a1e32b4 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/KotlinCompilerTreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/KotlinCompilerTreeShakingTest.java
@@ -3,12 +3,15 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.cf.bootstrap;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
 import com.android.tools.r8.internal.CompilationTestBase;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -50,7 +53,7 @@
   public void testForRuntime() throws Exception {
     // Compile Hello.kt and make sure it works as expected.
     Path classPathBefore =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addSourceFiles(HELLO_KT)
             .setOutputPath(temp.newFolder().toPath())
             .compile();
@@ -114,7 +117,10 @@
     // TODO(b/144859533): passing `dir` as -kotlin-home.
     // Compile Hello.kt again with r8-processed kotlin-compiler.jar
     Path classPathAfter =
-        kotlinc(parameters.getRuntime().asCf(), r8ProcessedKotlinc)
+        kotlinc(
+                parameters.getRuntime().asCf(),
+                new KotlinCompiler("r8ProcessedKotlinc", r8ProcessedKotlinc),
+                KotlinTargetVersion.JAVA_8)
             .addSourceFiles(HELLO_KT)
             .setOutputPath(temp.newFolder().toPath())
             .compile();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInExtensionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInExtensionTest.java
index 1569404..e256e37 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInExtensionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInExtensionTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -94,7 +95,7 @@
 
     String appFolder = PKG_PREFIX + "/extension_app";
     ProcessResult kotlinTestCompileResult =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(r8ProcessedLibZip)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
@@ -142,7 +143,7 @@
 
     String appFolder = PKG_PREFIX + "/extension_app";
     Path output =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(libJar)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInParametertypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInParametertypeTest.java
index 0155279..1030339 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInParametertypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInParametertypeTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -94,7 +95,7 @@
 
     String appFolder = PKG_PREFIX + "/parametertype_app";
     ProcessResult processResult =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(libJar)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInPropertyTest.java
index 9883e66..fe815d0 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInPropertyTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -92,7 +93,7 @@
 
     String appFolder = PKG_PREFIX + "/propertytype_app";
     ProcessResult processResult =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(libJar)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInReturntypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInReturntypeTest.java
index cc493c6..da6bf76 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInReturntypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInReturntypeTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -93,7 +94,7 @@
 
     String appFolder = PKG_PREFIX + "/returntype_app";
     ProcessResult processResult =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(libJar)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInSupertypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInSupertypeTest.java
index f89ee5e..dc29f2c 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInSupertypeTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRenameInSupertypeTest.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.kotlin.metadata;
 
+import static com.android.tools.r8.KotlinCompilerTool.KOTLINC;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isRenamed;
 import static org.hamcrest.CoreMatchers.containsString;
@@ -91,7 +92,7 @@
 
     String appFolder = PKG_PREFIX + "/supertype_app";
     Path output =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(r8ProcessedLibZip)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())
@@ -139,7 +140,7 @@
 
     String appFolder = PKG_PREFIX + "/supertype_app";
     Path output =
-        kotlinc(parameters.getRuntime().asCf())
+        kotlinc(parameters.getRuntime().asCf(), KOTLINC, KotlinTargetVersion.JAVA_8)
             .addClasspathFiles(libJar)
             .addSourceFiles(getKotlinFileInTest(appFolder, "main"))
             .setOutputPath(temp.newFolder().toPath())