From 12f393791bf4b7ef9a00e27fd5a48809d0c9fdaa Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 14 Feb 2024 13:34:00 +0100 Subject: [PATCH] JVM: allow -jvm-target 1.8 with -Xjdk-release=1.6 #KT-59098 --- .../src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt | 11 ++++++++++- compiler/testData/cli/jvm/jdkRelease.kt | 6 +++++- .../cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args | 8 ++++++++ .../cli/jvm/jdkRelease6WithJvmTarget8Jdk11.out | 7 +++++++ .../cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args | 8 ++++++++ .../cli/jvm/jdkRelease6WithJvmTarget8Jdk8.out | 2 ++ .../org/jetbrains/kotlin/cli/AbstractCliTest.java | 3 +++ .../org/jetbrains/kotlin/cli/CliTestGenerated.java | 10 ++++++++++ 8 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args create mode 100644 compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.out create mode 100644 compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args create mode 100644 compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.out diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt index 217c25802f7..85adcc10b46 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -41,7 +41,7 @@ fun CompilerConfiguration.setupJvmSpecificArguments(arguments: K2JVMCompilerArgu if (value != getJavaVersion() || arguments.jdkHome != null) { put(JVMConfigurationKeys.JDK_RELEASE, value) } - if (jvmTargetArg != null && jvmTargetArg != releaseTargetArg) { + if (jvmTargetArg != null && !isCompatibleJvmTargetAndRelease(jvmTargetArg, releaseTargetArg)) { messageCollector.report( ERROR, "'-Xjdk-release=$releaseTargetArg' option conflicts with '-jvm-target $jvmTargetArg'. " + @@ -110,6 +110,15 @@ fun CompilerConfiguration.setupJvmSpecificArguments(arguments: K2JVMCompilerArgu addAll(JVMConfigurationKeys.ADDITIONAL_JAVA_MODULES, arguments.additionalJavaModules?.asList()) } +private fun isCompatibleJvmTargetAndRelease(jvmTarget: String, release: String): Boolean { + if (jvmTarget == "1.8") { + // This is needed to be able to compile stdlib with -jvm-target 1.8 and -Xjdk-release=1.6/1.7. + return release in listOf("6", "1.6", "8", "1.8") + } + + return jvmTarget == release +} + private fun CompilerConfiguration.handleClosureGenerationSchemeArgument( flag: String, value: String?, diff --git a/compiler/testData/cli/jvm/jdkRelease.kt b/compiler/testData/cli/jvm/jdkRelease.kt index d74678470a4..271846be0cf 100644 --- a/compiler/testData/cli/jvm/jdkRelease.kt +++ b/compiler/testData/cli/jvm/jdkRelease.kt @@ -1 +1,5 @@ -fun clear(byteByffer: java.nio.ByteBuffer) = byteByffer.clear() \ No newline at end of file +fun clear(byteByffer: java.nio.ByteBuffer) = byteByffer.clear() + +fun path(): java.nio.file.Path? = null + +fun stream() = java.util.stream.Stream.of(42) diff --git a/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args new file mode 100644 index 00000000000..e0e6e8174d6 --- /dev/null +++ b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args @@ -0,0 +1,8 @@ +-Xjdk-release=1.6 +-jvm-target +1.8 +-jdk-home +$JDK_11_0 +$TESTDATA_DIR$/jdkRelease.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.out b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.out new file mode 100644 index 00000000000..b0b33a2bb48 --- /dev/null +++ b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.out @@ -0,0 +1,7 @@ +compiler/testData/cli/jvm/jdkRelease.kt:3:22: error: unresolved reference 'file'. +fun path(): java.nio.file.Path? = null + ^^^^ +compiler/testData/cli/jvm/jdkRelease.kt:5:26: error: unresolved reference 'stream'. +fun stream() = java.util.stream.Stream.of(42) + ^^^^^^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args new file mode 100644 index 00000000000..da7a84efdb0 --- /dev/null +++ b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args @@ -0,0 +1,8 @@ +-Xjdk-release=1.6 +-jvm-target +1.8 +-jdk-home +$JDK_1_8 +$TESTDATA_DIR$/jdkRelease.kt +-d +$TEMP_DIR$ diff --git a/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.out b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.out new file mode 100644 index 00000000000..1169ff06a58 --- /dev/null +++ b/compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.out @@ -0,0 +1,2 @@ +error: '-Xjdk-release=6' option is not supported by used JDK: $JDK_1_8 +COMPILATION_ERROR diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/cli/AbstractCliTest.java b/compiler/tests-common/tests/org/jetbrains/kotlin/cli/AbstractCliTest.java index 3b631196ce9..ce811e99728 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/cli/AbstractCliTest.java +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/cli/AbstractCliTest.java @@ -251,6 +251,9 @@ public abstract class AbstractCliTest extends TestCaseWithTmpdir { return null; } + if (arg.equals("$JDK_1_8")) return KtTestUtil.getJdk8Home().getAbsolutePath(); + if (arg.equals("$JDK_11_0")) return KtTestUtil.getJdk11Home().getAbsolutePath(); + String argWithColonsReplaced = arg .replace("\\:", "$COLON$") .replace(":", File.pathSeparator) diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index 68306d82c10..ca626d85f3d 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -755,6 +755,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/jdkRelease.args"); } + @TestMetadata("jdkRelease6WithJvmTarget8Jdk11.args") + public void testJdkRelease6WithJvmTarget8Jdk11() { + runTest("compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk11.args"); + } + + @TestMetadata("jdkRelease6WithJvmTarget8Jdk8.args") + public void testJdkRelease6WithJvmTarget8Jdk8() { + runTest("compiler/testData/cli/jvm/jdkRelease6WithJvmTarget8Jdk8.args"); + } + @TestMetadata("jdkRelease6WithoutExplicitJvmTarget.args") public void testJdkRelease6WithoutExplicitJvmTarget() { runTest("compiler/testData/cli/jvm/jdkRelease6WithoutExplicitJvmTarget.args");