diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java index 53ca95177fa..aef1f8195dc 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.config.Services; import org.jetbrains.kotlin.progress.CompilationCanceledException; import org.jetbrains.kotlin.progress.CompilationCanceledStatus; import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus; +import org.jetbrains.kotlin.utils.StringsKt; import java.io.PrintStream; import java.util.List; @@ -245,10 +246,18 @@ public abstract class CLICompiler { } if (arguments.languageVersion != null) { - configuration.put( - CommonConfigurationKeys.LANGUAGE_FEATURE_SETTINGS, - LanguageFeatureSettings.fromLanguageVersion(arguments.languageVersion) - ); + LanguageFeatureSettings languageFeatureSettings = LanguageFeatureSettings.fromLanguageVersion(arguments.languageVersion); + if (languageFeatureSettings != null) { + configuration.put(CommonConfigurationKeys.LANGUAGE_FEATURE_SETTINGS, languageFeatureSettings); + } + else { + String message = + "Unknown language version: " + arguments.languageVersion + "\n" + + "Supported language versions: " + StringsKt.join(LanguageFeatureSettings.getAllLanguageVersions(), ", "); + configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY).report( + CompilerMessageSeverity.ERROR, message, CompilerMessageLocation.NO_LOCATION + ); + } } } diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt index 39ef8df5e40..0f83affcac4 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -221,10 +221,11 @@ class K2JVMCompiler : CLICompiler() { configuration: CompilerConfiguration, arguments: K2JVMCompilerArguments, services: Services ) { if (IncrementalCompilation.isEnabled()) { - configuration.put( - JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS, - services.get(IncrementalCompilationComponents::class.java) - ) + val components = services.get(IncrementalCompilationComponents::class.java) + @Suppress("SENSELESS_COMPARISON") + if (components != null) { + configuration.put(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS, components) + } } } @@ -283,10 +284,11 @@ class K2JVMCompiler : CLICompiler() { configuration.put(JVMConfigurationKeys.DISABLE_CALL_ASSERTIONS, arguments.noCallAssertions) configuration.put(JVMConfigurationKeys.DISABLE_PARAM_ASSERTIONS, arguments.noParamAssertions) configuration.put(JVMConfigurationKeys.DISABLE_OPTIMIZATION, arguments.noOptimize) - configuration.put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, arguments.declarationsOutputPath) configuration.put(JVMConfigurationKeys.INHERIT_MULTIFILE_PARTS, arguments.inheritMultifileParts) configuration.put(CLIConfigurationKeys.ALLOW_KOTLIN_PACKAGE, arguments.allowKotlinPackage) configuration.put(CLIConfigurationKeys.REPORT_PERF, arguments.reportPerf) + + arguments.declarationsOutputPath?.let { configuration.put(JVMConfigurationKeys.DECLARATIONS_JSON_PATH, it) } } private fun getClasspath(paths: KotlinPaths, arguments: K2JVMCompilerArguments): List { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java b/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java index 634f1926db8..f841f093e3b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/config/CompilerConfiguration.java @@ -62,7 +62,7 @@ public class CompilerConfiguration { return data == null ? Collections.emptyList() : data; } - public void put(@NotNull CompilerConfigurationKey key, @Nullable T value) { + public void put(@NotNull CompilerConfigurationKey key, @NotNull T value) { checkReadOnly(); map.put(key.ideaKey, value); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageFeatureSettings.kt b/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageFeatureSettings.kt index 67ade88b0ca..b12f937fe04 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageFeatureSettings.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/config/LanguageFeatureSettings.kt @@ -39,5 +39,8 @@ class LanguageFeatureSettings( @JvmStatic fun fromLanguageVersion(source: String): LanguageFeatureSettings? = SETTINGS[source] + + @JvmStatic + fun getAllLanguageVersions(): List = SETTINGS.keys.toList() } } diff --git a/compiler/testData/cli/js/languageVersion.args b/compiler/testData/cli/js/languageVersion.args new file mode 100644 index 00000000000..377825bbeeb --- /dev/null +++ b/compiler/testData/cli/js/languageVersion.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/languageVersion.kt +-output +$TEMP_DIR$/out.js +-language-version +1.0 diff --git a/compiler/testData/cli/js/languageVersion.kt b/compiler/testData/cli/js/languageVersion.kt new file mode 100644 index 00000000000..73d94ad88be --- /dev/null +++ b/compiler/testData/cli/js/languageVersion.kt @@ -0,0 +1,5 @@ +package test + +sealed class Base + +class Derived : Base() diff --git a/compiler/testData/cli/js/languageVersion.out b/compiler/testData/cli/js/languageVersion.out new file mode 100644 index 00000000000..d0066724501 --- /dev/null +++ b/compiler/testData/cli/js/languageVersion.out @@ -0,0 +1,4 @@ +compiler/testData/cli/js/languageVersion.kt:5:17: error: this type is sealed, so it can be inherited by only its own nested classes or objects +class Derived : Base() + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/languageVersion.args b/compiler/testData/cli/jvm/languageVersion.args new file mode 100644 index 00000000000..2b0e3d5e862 --- /dev/null +++ b/compiler/testData/cli/jvm/languageVersion.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/languageVersion.kt +-d +$TEMP_DIR$ +-language-version +1.0 diff --git a/compiler/testData/cli/jvm/languageVersion.kt b/compiler/testData/cli/jvm/languageVersion.kt new file mode 100644 index 00000000000..73d94ad88be --- /dev/null +++ b/compiler/testData/cli/jvm/languageVersion.kt @@ -0,0 +1,5 @@ +package test + +sealed class Base + +class Derived : Base() diff --git a/compiler/testData/cli/jvm/languageVersion.out b/compiler/testData/cli/jvm/languageVersion.out new file mode 100644 index 00000000000..cdd464da409 --- /dev/null +++ b/compiler/testData/cli/jvm/languageVersion.out @@ -0,0 +1,4 @@ +compiler/testData/cli/jvm/languageVersion.kt:5:17: error: this type is sealed, so it can be inherited by only its own nested classes or objects +class Derived : Base() + ^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/languageVersionInvalid.args b/compiler/testData/cli/jvm/languageVersionInvalid.args new file mode 100644 index 00000000000..26050e77cc3 --- /dev/null +++ b/compiler/testData/cli/jvm/languageVersionInvalid.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/simple.kt +-d +$TEMP_DIR$ +-language-version +239.42 diff --git a/compiler/testData/cli/jvm/languageVersionInvalid.out b/compiler/testData/cli/jvm/languageVersionInvalid.out new file mode 100644 index 00000000000..309af4defbb --- /dev/null +++ b/compiler/testData/cli/jvm/languageVersionInvalid.out @@ -0,0 +1,3 @@ +error: unknown language version: 239.42 +Supported language versions: 1.0, 1.1 +COMPILATION_ERROR \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index cc45a2d6963..3a5cfb04657 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -151,6 +151,18 @@ public class CliTestGenerated extends AbstractCliTest { doJvmTest(fileName); } + @TestMetadata("languageVersion.args") + public void testLanguageVersion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/languageVersion.args"); + doJvmTest(fileName); + } + + @TestMetadata("languageVersionInvalid.args") + public void testLanguageVersionInvalid() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/languageVersionInvalid.args"); + doJvmTest(fileName); + } + @TestMetadata("multipleTextRangesInDiagnosticsOrder.args") public void testMultipleTextRangesInDiagnosticsOrder() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/multipleTextRangesInDiagnosticsOrder.args"); @@ -340,6 +352,12 @@ public class CliTestGenerated extends AbstractCliTest { doJsTest(fileName); } + @TestMetadata("languageVersion.args") + public void testLanguageVersion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/js/languageVersion.args"); + doJsTest(fileName); + } + @TestMetadata("libraryDirNotFound.args") public void testLibraryDirNotFound() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/js/libraryDirNotFound.args");