Run Kotlin tests for target 1.8
By default, the Kotlin compiler generates classes for target 1.6.
This CL updates the build.gradle file to also build classes for
target 1.8.
Also updates parameters of R8 Kotlin tests to run on 1.8 classes.
Bug: 71894643
Change-Id: I9fafc642dc2d422fff721c3d592c6884d8503fbb
diff --git a/build.gradle b/build.gradle
index 8893820..c5659d1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1167,13 +1167,17 @@
task buildKotlinR8TestResources {
def examplesDir = file("src/test/kotlinR8TestResources")
examplesDir.eachDir { dir ->
- def name = dir.getName()
- def taskName = "jar_kotlinR8TestResources_${name}"
- task "${taskName}"(type: kotlin.Kotlinc) {
- source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.kt')
- destination = file("build/test/kotlinR8TestResources/${name}.jar")
+ kotlin.Kotlinc.KotlinTargetVersion.values().each { kotlinTargetVersion ->
+ def name = dir.getName()
+ def taskName = "jar_kotlinR8TestResources_${name}_${kotlinTargetVersion}"
+ def outputFile = "build/test/kotlinR8TestResources/${kotlinTargetVersion}/${name}.jar"
+ task "${taskName}"(type: kotlin.Kotlinc) {
+ source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.kt')
+ destination = file(outputFile)
+ targetVersion = kotlinTargetVersion
+ }
+ dependsOn taskName
}
- dependsOn taskName
}
}
diff --git a/buildSrc/src/main/java/kotlin/Kotlinc.java b/buildSrc/src/main/java/kotlin/Kotlinc.java
index 261acc3..0c0a50a 100644
--- a/buildSrc/src/main/java/kotlin/Kotlinc.java
+++ b/buildSrc/src/main/java/kotlin/Kotlinc.java
@@ -19,16 +19,29 @@
import utils.Utils;
/**
- * Gradle task to compile Kotlin source files.
+ * Gradle task to compile Kotlin source files. By default the generated classes target Java 1.6.
*/
public class Kotlinc extends DefaultTask {
+ enum KotlinTargetVersion {
+ JAVA_6("1.6"),
+ JAVA_8("1.8");
+
+ private final String optionName;
+
+ KotlinTargetVersion(String optionName) {
+ this.optionName = optionName;
+ }
+ }
+
@InputFiles
private FileTree source;
@OutputFile
private File destination;
+ private KotlinTargetVersion targetVersion = KotlinTargetVersion.JAVA_6;
+
public FileTree getSource() {
return source;
}
@@ -45,6 +58,14 @@
this.destination = destination;
}
+ public KotlinTargetVersion getTargetVersion() {
+ return targetVersion;
+ }
+
+ public void setTargetVersion(KotlinTargetVersion targetVersion) {
+ this.targetVersion = targetVersion;
+ }
+
@TaskAction
public void compile() {
getProject().exec(new Action<ExecSpec>() {
@@ -57,6 +78,7 @@
execSpec.setExecutable(kotlincExecPath.toFile());
execSpec.args("-include-runtime");
execSpec.args("-nowarn");
+ execSpec.args("-jvm-target", targetVersion.optionName);
execSpec.args("-d", destination.getCanonicalPath());
execSpec.args(source.getFiles());
} catch (IOException e) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index d9f10ae..cc325e2 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1245,4 +1245,19 @@
options,
null);
}
+
+ public enum KotlinTargetVersion {
+ JAVA_6("JAVA_6"),
+ JAVA_8("JAVA_8");
+
+ private final String folderName;
+
+ KotlinTargetVersion(String folderName) {
+ this.folderName = folderName;
+ }
+
+ public String getFolderName() {
+ return folderName;
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 15c20c5..9f520a2 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -13,6 +13,7 @@
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -21,24 +22,35 @@
import com.android.tools.r8.utils.DexInspector.ClassSubject;
import com.android.tools.r8.utils.DexInspector.MethodSubject;
import com.android.tools.r8.utils.FileUtils;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableList.Builder;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Map;
import org.junit.Assume;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
-// TODO(shertz) also run with backend 1.8
+@RunWith(Parameterized.class)
public abstract class AbstractR8KotlinTestBase extends TestBase {
- public static final String KOTLIN_R8_TEST_RESOURCES_BUILD_DIR =
- ToolHelper.TESTS_BUILD_DIR + "/kotlinR8TestResources";
-
- protected final boolean allowAccessModification;
-
- protected AbstractR8KotlinTestBase(boolean allowAccessModification) {
- this.allowAccessModification = allowAccessModification;
+ @Parameters(name = "{0}_{1}")
+ public static Collection<Object[]> data() {
+ ImmutableList.Builder<Object[]> builder = new Builder<>();
+ for (KotlinTargetVersion targetVersion : KotlinTargetVersion.values()) {
+ builder.add(new Object[]{Boolean.TRUE, targetVersion});
+ builder.add(new Object[]{Boolean.FALSE, targetVersion});
+ }
+ return builder.build();
}
+ @Parameter(0) public boolean allowAccessModification;
+ @Parameter(1) public KotlinTargetVersion targetVersion;
+
protected static void checkMethodIsInvokedAtLeastOnce(DexCode dexCode,
MethodSignature... methodSignatures) {
for (MethodSignature methodSignature : methodSignatures) {
@@ -143,8 +155,7 @@
AndroidAppInspector inspector) throws Exception {
Assume.assumeTrue(ToolHelper.artSupported());
- Path jarFile =
- Paths.get(KOTLIN_R8_TEST_RESOURCES_BUILD_DIR, folder + FileUtils.JAR_EXTENSION);
+ Path jarFile = getJarFile(folder);
String proguardRules = buildProguardRules(mainClass);
if (extraProguardRules != null) {
@@ -176,6 +187,11 @@
inspector.inspectApp(app);
}
+ private Path getJarFile(String folder) {
+ return Paths.get(ToolHelper.TESTS_BUILD_DIR, "kotlinR8TestResources",
+ targetVersion.getFolderName(), folder + FileUtils.JAR_EXTENSION);
+ }
+
@FunctionalInterface
interface AndroidAppInspector {
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index fe0efd1..379579f 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -9,15 +9,9 @@
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.ClassSubject;
import com.android.tools.r8.utils.DexInspector.MethodSubject;
-import com.google.common.collect.ImmutableList;
-import java.util.Collection;
import java.util.Collections;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-@RunWith(Parameterized.class)
public class R8KotlinDataClassTest extends AbstractR8KotlinTestBase {
private static final KotlinDataClass TEST_DATA_CLASS = new KotlinDataClass("dataclass.Person")
@@ -37,15 +31,6 @@
private static final MethodSignature COPY_DEFAULT_METHOD =
TEST_DATA_CLASS.getCopyDefaultSignature();
- public R8KotlinDataClassTest(boolean allowAccessModification) {
- super(allowAccessModification);
- }
-
- @Parameters(name = "{0}")
- public static Collection<Object> data() {
- return ImmutableList.of(Boolean.TRUE, Boolean.FALSE);
- }
-
@Test
public void test_dataclass_gettersOnly() throws Exception {
final String mainClassName = "dataclass.MainGettersOnlyKt";
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
index fc2a7bb..b059382 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinIntrinsicsTest.java
@@ -7,15 +7,12 @@
import com.android.tools.r8.naming.MemberNaming.MethodSignature;
import com.android.tools.r8.utils.DexInspector;
import com.android.tools.r8.utils.DexInspector.ClassSubject;
-import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
-import java.util.Collection;
import java.util.Collections;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class R8KotlinIntrinsicsTest extends AbstractR8KotlinTestBase {
@@ -23,15 +20,6 @@
private static final KotlinDataClass KOTLIN_INTRINSICS_CLASS =
new KotlinDataClass("kotlin.jvm.internal.Intrinsics");
- @Parameters(name = "{0}")
- public static Collection<Object> data() {
- return ImmutableList.of(Boolean.TRUE, Boolean.FALSE);
- }
-
- public R8KotlinIntrinsicsTest(boolean allowAccessModification) {
- super(allowAccessModification);
- }
-
@Test
public void testParameterNullCheckIsInlined() throws Exception {
final String extraRules = keepClassMethod("intrinsics.IntrinsicsKt",