From fee72839bf7164633a5dbef6e61c3c403731fe77 Mon Sep 17 00:00:00 2001 From: Pavel Kirpichenkov Date: Mon, 3 Feb 2020 16:34:48 +0300 Subject: [PATCH] Report error if IR is enabled with incorrect language version ^KT-36338 Fixed --- .../arguments/CommonCompilerArguments.kt | 5 ++++ .../common/arguments/K2JSCompilerArguments.kt | 18 +++++++++++++ .../arguments/K2JVMCompilerArguments.kt | 13 ++++++++++ .../cli/js/irApiVersionUnsupported.args | 8 ++++++ .../cli/js/irApiVersionUnsupported.out | 2 ++ .../cli/js/irLanguageVersionUnsupported.args | 6 +++++ .../cli/js/irLanguageVersionUnsupported.out | 2 ++ .../cli/jvm/irApiVersionUnsupported.args | 8 ++++++ .../cli/jvm/irApiVersionUnsupported.out | 3 +++ .../cli/jvm/irLanguageVersionUnsupported.args | 6 +++++ .../cli/jvm/irLanguageVersionUnsupported.out | 3 +++ compiler/testData/cli/jvm/irSupported.args | 8 ++++++ compiler/testData/cli/jvm/irSupported.out | 1 + .../kotlin/cli/CliTestGenerated.java | 25 +++++++++++++++++++ 14 files changed, 108 insertions(+) create mode 100644 compiler/testData/cli/js/irApiVersionUnsupported.args create mode 100644 compiler/testData/cli/js/irApiVersionUnsupported.out create mode 100644 compiler/testData/cli/js/irLanguageVersionUnsupported.args create mode 100644 compiler/testData/cli/js/irLanguageVersionUnsupported.out create mode 100644 compiler/testData/cli/jvm/irApiVersionUnsupported.args create mode 100644 compiler/testData/cli/jvm/irApiVersionUnsupported.out create mode 100644 compiler/testData/cli/jvm/irLanguageVersionUnsupported.args create mode 100644 compiler/testData/cli/jvm/irLanguageVersionUnsupported.out create mode 100644 compiler/testData/cli/jvm/irSupported.args create mode 100644 compiler/testData/cli/jvm/irSupported.out diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt index 8fd0e2581e0..95e78c304b2 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.kt @@ -497,6 +497,7 @@ abstract class CommonCompilerArguments : CommonToolArguments() { ) checkCoroutines(languageVersionSettings, collector) + checkIrSupport(languageVersionSettings, collector) return languageVersionSettings } @@ -577,6 +578,10 @@ abstract class CommonCompilerArguments : CommonToolArguments() { } } + protected open fun checkIrSupport(languageVersionSettings: LanguageVersionSettings, collector: MessageCollector) { + // backend-specific + } + private enum class VersionKind(val text: String) { LANGUAGE("Language"), API("API") } diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt index f57da065a4d..c08a46ccb55 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/K2JSCompilerArguments.kt @@ -18,6 +18,11 @@ package org.jetbrains.kotlin.cli.common.arguments import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants.CALL import org.jetbrains.kotlin.cli.common.arguments.K2JsArgumentConstants.NO_CALL +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.MessageCollector +import org.jetbrains.kotlin.config.ApiVersion +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.config.LanguageVersionSettings class K2JSCompilerArguments : CommonCompilerArguments() { companion object { @@ -164,6 +169,19 @@ class K2JSCompilerArguments : CommonCompilerArguments() { @Argument(value = "-Xenable-js-scripting", description = "Enable experimental support of .kts files using K/JS (with -Xir only)") var enableJsScripting: Boolean by FreezableVar(false) + + override fun checkIrSupport(languageVersionSettings: LanguageVersionSettings, collector: MessageCollector) { + if (!isIrBackendEnabled()) return + + if (languageVersionSettings.languageVersion < LanguageVersion.KOTLIN_1_4 + || languageVersionSettings.apiVersion < ApiVersion.KOTLIN_1_4 + ) { + collector.report( + CompilerMessageSeverity.ERROR, + "IR backend cannot be used with language or API version below 1.4" + ) + } + } } fun K2JSCompilerArguments.isPreIrBackendDisabled(): Boolean = 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 923e04605df..b91b618845d 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 @@ -352,4 +352,17 @@ class K2JVMCompilerArguments : CommonCompilerArguments() { } return result } + + override fun checkIrSupport(languageVersionSettings: LanguageVersionSettings, collector: MessageCollector) { + if (!useIR) return + + if (languageVersionSettings.languageVersion < LanguageVersion.KOTLIN_1_3 + || languageVersionSettings.apiVersion < ApiVersion.KOTLIN_1_3 + ) { + collector.report( + CompilerMessageSeverity.ERROR, + "IR backend cannot be used with language or API version below 1.3" + ) + } + } } diff --git a/compiler/testData/cli/js/irApiVersionUnsupported.args b/compiler/testData/cli/js/irApiVersionUnsupported.args new file mode 100644 index 00000000000..f9e288f0150 --- /dev/null +++ b/compiler/testData/cli/js/irApiVersionUnsupported.args @@ -0,0 +1,8 @@ +$TESTDATA_DIR$/simple2js.kt +-Xir-produce-js +-language-version +1.4 +-api-version +1.3 +-output +$TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/irApiVersionUnsupported.out b/compiler/testData/cli/js/irApiVersionUnsupported.out new file mode 100644 index 00000000000..b55e747994d --- /dev/null +++ b/compiler/testData/cli/js/irApiVersionUnsupported.out @@ -0,0 +1,2 @@ +error: IR backend cannot be used with language or API version below 1.4 +COMPILATION_ERROR diff --git a/compiler/testData/cli/js/irLanguageVersionUnsupported.args b/compiler/testData/cli/js/irLanguageVersionUnsupported.args new file mode 100644 index 00000000000..b9d94dcbcfc --- /dev/null +++ b/compiler/testData/cli/js/irLanguageVersionUnsupported.args @@ -0,0 +1,6 @@ +$TESTDATA_DIR$/simple2js.kt +-Xir-produce-js +-language-version +1.3 +-output +$TEMP_DIR$/out.js diff --git a/compiler/testData/cli/js/irLanguageVersionUnsupported.out b/compiler/testData/cli/js/irLanguageVersionUnsupported.out new file mode 100644 index 00000000000..b55e747994d --- /dev/null +++ b/compiler/testData/cli/js/irLanguageVersionUnsupported.out @@ -0,0 +1,2 @@ +error: IR backend cannot be used with language or API version below 1.4 +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/irApiVersionUnsupported.args b/compiler/testData/cli/jvm/irApiVersionUnsupported.args new file mode 100644 index 00000000000..07d5b8b2c85 --- /dev/null +++ b/compiler/testData/cli/jvm/irApiVersionUnsupported.args @@ -0,0 +1,8 @@ +$TESTDATA_DIR$/simple.kt +-d +$TEMP_DIR$ +-language-version +1.3 +-api-version +1.2 +-Xuse-ir diff --git a/compiler/testData/cli/jvm/irApiVersionUnsupported.out b/compiler/testData/cli/jvm/irApiVersionUnsupported.out new file mode 100644 index 00000000000..9a6cb045795 --- /dev/null +++ b/compiler/testData/cli/jvm/irApiVersionUnsupported.out @@ -0,0 +1,3 @@ +warning: API version 1.2 is deprecated and its support will be removed in a future version of Kotlin +error: IR backend cannot be used with language or API version below 1.3 +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/irLanguageVersionUnsupported.args b/compiler/testData/cli/jvm/irLanguageVersionUnsupported.args new file mode 100644 index 00000000000..5fa29a50887 --- /dev/null +++ b/compiler/testData/cli/jvm/irLanguageVersionUnsupported.args @@ -0,0 +1,6 @@ +$TESTDATA_DIR$/simple.kt +-d +$TEMP_DIR$ +-language-version +1.2 +-Xuse-ir diff --git a/compiler/testData/cli/jvm/irLanguageVersionUnsupported.out b/compiler/testData/cli/jvm/irLanguageVersionUnsupported.out new file mode 100644 index 00000000000..3914b5bd907 --- /dev/null +++ b/compiler/testData/cli/jvm/irLanguageVersionUnsupported.out @@ -0,0 +1,3 @@ +warning: language version 1.2 is deprecated and its support will be removed in a future version of Kotlin +error: IR backend cannot be used with language or API version below 1.3 +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/irSupported.args b/compiler/testData/cli/jvm/irSupported.args new file mode 100644 index 00000000000..0031a829d66 --- /dev/null +++ b/compiler/testData/cli/jvm/irSupported.args @@ -0,0 +1,8 @@ +$TESTDATA_DIR$/simple.kt +-d +$TEMP_DIR$ +-language-version +1.3 +-api-version +1.3 +-Xuse-ir diff --git a/compiler/testData/cli/jvm/irSupported.out b/compiler/testData/cli/jvm/irSupported.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/cli/jvm/irSupported.out @@ -0,0 +1 @@ +OK diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 9318faee830..931bd48e17b 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -365,6 +365,21 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/invalidMetadataVersion.args"); } + @TestMetadata("irApiVersionUnsupported.args") + public void testIrApiVersionUnsupported() throws Exception { + runTest("compiler/testData/cli/jvm/irApiVersionUnsupported.args"); + } + + @TestMetadata("irLanguageVersionUnsupported.args") + public void testIrLanguageVersionUnsupported() throws Exception { + runTest("compiler/testData/cli/jvm/irLanguageVersionUnsupported.args"); + } + + @TestMetadata("irSupported.args") + public void testIrSupported() throws Exception { + runTest("compiler/testData/cli/jvm/irSupported.args"); + } + @TestMetadata("javaSrcWrongPackage.args") public void testJavaSrcWrongPackage() throws Exception { runTest("compiler/testData/cli/jvm/javaSrcWrongPackage.args"); @@ -783,6 +798,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/js/inlineCycle.args"); } + @TestMetadata("irApiVersionUnsupported.args") + public void testIrApiVersionUnsupported() throws Exception { + runTest("compiler/testData/cli/js/irApiVersionUnsupported.args"); + } + + @TestMetadata("irLanguageVersionUnsupported.args") + public void testIrLanguageVersionUnsupported() throws Exception { + runTest("compiler/testData/cli/js/irLanguageVersionUnsupported.args"); + } + @TestMetadata("jsExtraHelp.args") public void testJsExtraHelp() throws Exception { runTest("compiler/testData/cli/js/jsExtraHelp.args");