From 998a24414aa2df1ce8b77d9ce1dcdf05376bfa5d Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Sat, 27 Apr 2019 22:48:59 +0300 Subject: [PATCH] Improved parsing of internal compiler arguments with boolean state in case when the argument is listed twice in the list of command line arguments. The last value will be used. #KT-27181 Fixed --- .../common/arguments/parseCommandLineArguments.kt | 10 +++++++++- .../cli/jvm/internalArgOverrideLanguageFeature.args | 5 +++++ .../cli/jvm/internalArgOverrideLanguageFeature.out | 10 ++++++++++ .../jvm/internalArgOverrideOffLanguageFeature.args | 5 +++++ .../jvm/internalArgOverrideOffLanguageFeature.out | 13 +++++++++++++ .../org/jetbrains/kotlin/cli/CliTestGenerated.java | 10 ++++++++++ 6 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.args create mode 100644 compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.out create mode 100644 compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.args create mode 100644 compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.out diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/parseCommandLineArguments.kt b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/parseCommandLineArguments.kt index 20f1a89ab2a..59780398069 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/parseCommandLineArguments.kt +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/parseCommandLineArguments.kt @@ -135,7 +135,15 @@ private fun parsePreprocessedCommandLineArguments(args if (parser == null) { errors.unknownExtraFlags += arg } else { - internalArguments.add(parser.parseInternalArgument(arg, errors) ?: continue) + val newInternalArgument = parser.parseInternalArgument(arg, errors) ?: continue + val argumentWillBeOverridden = when (newInternalArgument) { + is ManualLanguageFeatureSetting -> internalArguments.firstOrNull { (it is ManualLanguageFeatureSetting) && (it.languageFeature == newInternalArgument.languageFeature) } + else -> null + } + if (argumentWillBeOverridden != null) { + internalArguments.remove(argumentWillBeOverridden) + } + internalArguments.add(newInternalArgument) } continue diff --git a/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.args b/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.args new file mode 100644 index 00000000000..fc96de163fa --- /dev/null +++ b/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/inlineClass.kt +-d +$TEMP_DIR$ +-XXLanguage:-InlineClasses +-XXLanguage:+InlineClasses \ No newline at end of file diff --git a/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.out b/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.out new file mode 100644 index 00000000000..1f9dd8a5872 --- /dev/null +++ b/compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.out @@ -0,0 +1,10 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage;+InlineClasses + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +OK \ No newline at end of file diff --git a/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.args b/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.args new file mode 100644 index 00000000000..c62d90b2974 --- /dev/null +++ b/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.args @@ -0,0 +1,5 @@ +$TESTDATA_DIR$/inlineClass.kt +-d +$TEMP_DIR$ +-XXLanguage:+InlineClasses +-XXLanguage:-InlineClasses \ No newline at end of file diff --git a/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.out b/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.out new file mode 100644 index 00000000000..1038c815c88 --- /dev/null +++ b/compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.out @@ -0,0 +1,13 @@ +warning: ATTENTION! +This build uses unsafe internal compiler arguments: + +-XXLanguage;-InlineClasses + +This mode is not recommended for production use, +as no stability/compatibility guarantees are given on +compiler or generated code. Use it at your own risk! + +compiler/testData/cli/jvm/inlineClass.kt:1:1: error: the feature "inline classes" is disabled +inline class Foo(val x: Int) +^ +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 5bd910c8bc8..48fb946f897 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -296,6 +296,16 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/internalArgNoWarningForEnablingBugfix.args"); } + @TestMetadata("internalArgOverrideLanguageFeature.args") + public void testInternalArgOverrideLanguageFeature() throws Exception { + runTest("compiler/testData/cli/jvm/internalArgOverrideLanguageFeature.args"); + } + + @TestMetadata("internalArgOverrideOffLanguageFeature.args") + public void testInternalArgOverrideOffLanguageFeature() throws Exception { + runTest("compiler/testData/cli/jvm/internalArgOverrideOffLanguageFeature.args"); + } + @TestMetadata("internalArgUnrecognizedFeature.args") public void testInternalArgUnrecognizedFeature() throws Exception { runTest("compiler/testData/cli/jvm/internalArgUnrecognizedFeature.args");