diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt index e5bd35f7e64..613686a92ab 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JVMCompilerArguments.kt @@ -389,13 +389,12 @@ default: `indy-with-constants` for JVM target 9 or greater, `inline` otherwise"" var stringConcat: String? by NullableStringFreezableVar(null) @Argument( - value = "-Xrelease", - valueDescription = "Supported versions depend on used JDK", - description = """ - Compile against specified JDK API. Supported versions depend on used JDK. - """ + value = "-Xjdk-release", + valueDescription = "", + description = """Compile against specified JDK API. Requires JDK 9 or newer. +Supported versions depend on used JDK (For JDK 17 supported targets are 1.8, 9, 10 - 17). Also set `-jvm-target` value""" ) - var release: String? by NullableStringFreezableVar(null) + var jdkRelease: String? by NullableStringFreezableVar(null) @Argument( 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 965f9995334..336dd9c7389 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/jvmArguments.kt @@ -25,8 +25,41 @@ fun CompilerConfiguration.setupJvmSpecificArguments(arguments: K2JVMCompilerArgu putIfNotNull(JVMConfigurationKeys.FRIEND_PATHS, arguments.friendPaths?.asList()) - if (arguments.jvmTarget != null) { - val jvmTarget = JvmTarget.fromString(arguments.jvmTarget!!) + val releaseTargetArg = arguments.jdkRelease + val jvmTargetArg = arguments.jvmTarget + if (releaseTargetArg != null) { + val value = + if (releaseTargetArg == "1.6" || releaseTargetArg == "1.8") releaseTargetArg.substringAfter("1.").toIntOrNull() + else releaseTargetArg.toIntOrNull() + if (value == null) { + messageCollector.report( + ERROR, + "Can't parse value passed for `-Xrelease`: $releaseTargetArg." + ) + } else { + if (value < 6) { + messageCollector.report( + ERROR, + "`$value` is not valid value for `-Xrelease` flag." + ) + } else { + //don't use release flag if it equals to compilation JDK version + if (value != getJavaVersion() || arguments.jdkHome != null) { + put(JVMConfigurationKeys.RELEASE, value) + } + if (jvmTargetArg != null && jvmTargetArg != releaseTargetArg) { + messageCollector.report( + ERROR, + "`-Xrelease=$releaseTargetArg` option conflicts with '-jvm-target=$jvmTargetArg'." + ) + } + } + } + } + + val jvmTargetValue = releaseTargetArg ?: jvmTargetArg + if (jvmTargetValue != null) { + val jvmTarget = JvmTarget.fromString(jvmTargetValue) if (jvmTarget != null) { put(JVMConfigurationKeys.JVM_TARGET, jvmTarget) if (jvmTarget == JvmTarget.JVM_1_6 && !arguments.suppressDeprecatedJvmTargetWarning) { @@ -37,7 +70,7 @@ fun CompilerConfiguration.setupJvmSpecificArguments(arguments: K2JVMCompilerArgu } } else { messageCollector.report( - ERROR, "Unknown JVM target version: ${arguments.jvmTarget}\n" + + ERROR, "Unknown JVM target version: $jvmTargetValue\n" + "Supported versions: ${JvmTarget.values().joinToString { it.description }}" ) } @@ -73,29 +106,6 @@ fun CompilerConfiguration.setupJvmSpecificArguments(arguments: K2JVMCompilerArgu } } - val releaseTarget = arguments.release - if (releaseTarget != null) { - val value = releaseTarget.toIntOrNull() - if (value == null) { - messageCollector.report( - ERROR, - "Can't parse value passed for `-Xrelease`: $releaseTarget." - ) - } else { - if (value < 6) { - messageCollector.report( - ERROR, - "`$value` is not valid value for `-Xrelease` flag." - ) - } else { - //don't use release flag if it equals to compilation JDK version - if (value != getJavaVersion() || arguments.jdkHome != null) { - put(JVMConfigurationKeys.RELEASE, value) - } - } - } - } - handleClosureGenerationSchemeArgument("-Xsam-conversions", arguments.samConversions, JVMConfigurationKeys.SAM_CONVERSIONS, jvmTarget) handleClosureGenerationSchemeArgument("-Xlambdas", arguments.lambdas, JVMConfigurationKeys.LAMBDAS, jvmTarget) diff --git a/compiler/testData/javaModules/releaseFlagConflict/module11.txt b/compiler/testData/javaModules/releaseFlagConflict/module11.txt new file mode 100644 index 00000000000..e4544816b30 --- /dev/null +++ b/compiler/testData/javaModules/releaseFlagConflict/module11.txt @@ -0,0 +1,2 @@ +error: `-Xrelease=11` option conflicts with '-jvm-target=10'. +COMPILATION_ERROR diff --git a/compiler/testData/javaModules/releaseFlagConflict/module11/foo/Foo.kt b/compiler/testData/javaModules/releaseFlagConflict/module11/foo/Foo.kt new file mode 100644 index 00000000000..0eee8cb9dd7 --- /dev/null +++ b/compiler/testData/javaModules/releaseFlagConflict/module11/foo/Foo.kt @@ -0,0 +1,6 @@ +package foo; + +public class Foo { + + val z: java.nio.ByteBuffer? = null +} diff --git a/compiler/testData/javaModules/releaseFlagConflict/module9.txt b/compiler/testData/javaModules/releaseFlagConflict/module9.txt new file mode 100644 index 00000000000..29e6b8b9b1a --- /dev/null +++ b/compiler/testData/javaModules/releaseFlagConflict/module9.txt @@ -0,0 +1,2 @@ +error: `-Xrelease=9` option conflicts with '-jvm-target=10'. +COMPILATION_ERROR diff --git a/compiler/testData/javaModules/releaseFlagConflict/module9/foo/Foo.kt b/compiler/testData/javaModules/releaseFlagConflict/module9/foo/Foo.kt new file mode 100644 index 00000000000..0eee8cb9dd7 --- /dev/null +++ b/compiler/testData/javaModules/releaseFlagConflict/module9/foo/Foo.kt @@ -0,0 +1,6 @@ +package foo; + +public class Foo { + + val z: java.nio.ByteBuffer? = null +} diff --git a/compiler/testData/javaModules/releaseFlagWrongValue/module5.txt b/compiler/testData/javaModules/releaseFlagWrongValue/module5.txt index 0c82de057db..3e84705198a 100644 --- a/compiler/testData/javaModules/releaseFlagWrongValue/module5.txt +++ b/compiler/testData/javaModules/releaseFlagWrongValue/module5.txt @@ -1,2 +1,4 @@ error: `5` is not valid value for `-Xrelease` flag. +error: unknown JVM target version: 5 +Supported versions: 1.6, 1.8, 9, 10, 11, 12, 13, 14, 15, 16, 17 COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java11ModulesIntegrationTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java11ModulesIntegrationTest.kt index d362b4acc3e..15eb9eb34e5 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java11ModulesIntegrationTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/Java11ModulesIntegrationTest.kt @@ -152,16 +152,23 @@ class Java11ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() { fun testReleaseFlagWrongValue() { // Test that although we have moduleA in the module path, it's not in the module graph // because we did not provide -Xadd-modules=moduleA - module("module5", additionalKotlinArguments = listOf("-Xrelease=5")) - module("module12", additionalKotlinArguments = listOf("-Xrelease=12")) + module("module5", additionalKotlinArguments = listOf("-Xjdk-release=5")) + module("module12", additionalKotlinArguments = listOf("-Xjdk-release=12")) } fun testReleaseFlag() { // Test that although we have moduleA in the module path, it's not in the module graph // because we did not provide -Xadd-modules=moduleA module("module") - module("module11", additionalKotlinArguments = listOf("-Xrelease=11")) - module("moduleSwing", additionalKotlinArguments = listOf("-Xrelease=9")) + module("module11", additionalKotlinArguments = listOf("-Xjdk-release=11")) + module("moduleSwing", additionalKotlinArguments = listOf("-Xjdk-release=9")) + } + + fun testReleaseFlagConflict() { + // Test that although we have moduleA in the module path, it's not in the module graph + // because we did not provide -Xadd-modules=moduleA + module("module9", additionalKotlinArguments = listOf("-Xjdk-release=9", "-jvm-target=10")) + module("module11", additionalKotlinArguments = listOf("-Xjdk-release=11", "-jvm-target=10")) } fun testNamedReadsTransitive() {