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())