Use -source/target 1.6 for Java sources in codegen tests

In cases when the test has the JVM_TARGET directive, use that one for
Java compilation as well.

Otherwise, for box tests, the corresponding test in `JvmTarget6OnJvm6`
(module `:compiler:tests-different-jdk`) will fail. However, it affects
all codegen tests, so fix a bunch of them which use Java 8+ features to
explicitly compile with JVM target 1.8. In particular, this obsoletes
the SKIP_JDK6 directive in those tests because "JVM_TARGET: 1.8" also
skips it for JDK 6.

The check for IS_SOURCE_6_STILL_SUPPORTED is needed in order to still be
able to run tests in the project while only having a single JDK > 11
installed, and having all of the env vars JDK_16, JDK_17, JDK_18
pointing to that JDK.
This commit is contained in:
Alexander Udalov
2020-11-16 18:53:10 +01:00
parent 7b4e0b2f5d
commit 7b5544ebd3
17 changed files with 50 additions and 35 deletions
@@ -18,12 +18,17 @@ package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget
import java.io.File
abstract class AbstractBlackBoxAgainstJavaCodegenTest : AbstractBlackBoxCodegenTest() {
override fun doMultiFileTest(wholeFile: File, files: List<TestFile>) {
javaClassesOutputDirectory = writeJavaFiles(files)!!.let { directory ->
CodegenTestUtil.compileJava(CodegenTestUtil.findJavaSourcesInDirectory(directory), emptyList(), extractJavacOptions(files))
val jvmTargets = files.mapNotNullTo(mutableSetOf()) { it.directives["JVM_TARGET"]?.let((JvmTarget)::fromString) }
check(jvmTargets.size <= 1) { "Having different JVM_TARGETs for different files is not supported in this test." }
CodegenTestUtil.compileJava(
CodegenTestUtil.findJavaSourcesInDirectory(directory), emptyList(), extractJavacOptions(files, jvmTargets.firstOrNull())
)
}
super.doMultiFileTest(wholeFile, files.map { file ->
@@ -63,9 +63,7 @@ import static org.jetbrains.kotlin.cli.common.output.OutputUtilsKt.writeAllTo;
import static org.jetbrains.kotlin.codegen.CodegenTestUtil.*;
import static org.jetbrains.kotlin.codegen.TestUtilsKt.extractUrls;
import static org.jetbrains.kotlin.test.KotlinTestUtils.getAnnotationsJar;
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getBoxMethodOrNull;
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.getGeneratedClass;
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.runBoxMethod;
import static org.jetbrains.kotlin.test.clientserver.TestProcessServerKt.*;
public abstract class CodegenTestCase extends KotlinBaseTest<KotlinBaseTest.TestFile> {
private static final String DEFAULT_TEST_FILE_NAME = "a_test";
@@ -487,7 +485,6 @@ public abstract class CodegenTestCase extends KotlinBaseTest<KotlinBaseTest.Test
it -> InTextDirectivesUtils.isDirectiveDefined(it.content, "ANDROID_ANNOTATIONS")
);
List<String> javacOptions = extractJavacOptions(files);
List<File> classpath = new ArrayList<>();
classpath.add(getAnnotationsJar());
@@ -531,6 +528,7 @@ public abstract class CodegenTestCase extends KotlinBaseTest<KotlinBaseTest.Test
updateJavaClasspath(javaClasspath);
javaClassesOutputDirectory = getJavaClassesOutputDirectory();
List<String> javacOptions = extractJavacOptions(files, configuration.get(JVMConfigurationKeys.JVM_TARGET));
compileJava(findJavaSourcesInDirectory(javaSourceDir), javaClasspath, javacOptions, javaClassesOutputDirectory);
}
}
@@ -538,22 +536,33 @@ public abstract class CodegenTestCase extends KotlinBaseTest<KotlinBaseTest.Test
protected void updateJavaClasspath(@NotNull List<String> javaClasspath) {}
@NotNull
protected static List<String> extractJavacOptions(@NotNull List<TestFile> files) {
protected static List<String> extractJavacOptions(@NotNull List<TestFile> files, @Nullable JvmTarget kotlinTarget) {
List<String> javacOptions = new ArrayList<>(0);
for (TestFile file : files) {
javacOptions.addAll(InTextDirectivesUtils.findListWithPrefixes(file.content, "// JAVAC_OPTIONS:"));
}
updateJavacOptions(javacOptions);
String javaTarget = computeJavaTarget(javacOptions, kotlinTarget);
if (javaTarget != null) {
javacOptions.add("-source");
javacOptions.add(javaTarget);
javacOptions.add("-target");
javacOptions.add(javaTarget);
}
return javacOptions;
}
private static void updateJavacOptions(@NotNull List<String> javacOptions) {
if (JAVA_COMPILATION_TARGET != null && !javacOptions.contains("-target")) {
javacOptions.add("-source");
javacOptions.add(JAVA_COMPILATION_TARGET);
javacOptions.add("-target");
javacOptions.add(JAVA_COMPILATION_TARGET);
}
private static final boolean IS_SOURCE_6_STILL_SUPPORTED =
// JDKs up to 11 do support -source/target 1.6, but later -- don't.
Arrays.asList("1.6", "1.7", "1.8", "9", "10", "11").contains(System.getProperty("java.specification.version"));
private static String computeJavaTarget(@NotNull List<String> javacOptions, @Nullable JvmTarget kotlinTarget) {
if (JAVA_COMPILATION_TARGET != null && !javacOptions.contains("-target"))
return JAVA_COMPILATION_TARGET;
if (kotlinTarget != null && kotlinTarget.compareTo(JvmTarget.JVM_1_6) > 0)
return kotlinTarget.getDescription();
if (IS_SOURCE_6_STILL_SUPPORTED)
return "1.6";
return null;
}
@NotNull