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 f6c60c7f581..a90bbb3eccb 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 @@ -54,6 +54,8 @@ data class ArgumentParseErrors( var argumentWithoutValue: String? = null, + var booleanArgumentWithValue: String? = null, + val argfileErrors: MutableList = SmartList(), // Reports from internal arguments parsers @@ -159,7 +161,16 @@ private fun parsePreprocessedCommandLineArguments(args val (property, argument) = argumentField val value: Any = when { - argumentField.property.returnType.classifier == Boolean::class -> true + argumentField.property.returnType.classifier == Boolean::class -> { + if (arg.startsWith(argument.value + "=")) { + // Can't use toBooleanStrict yet because this part of the compiler is used in Gradle and needs API version 1.4. + when (arg.substring(argument.value.length + 1)) { + "true" -> true + "false" -> false + else -> true.also { errors.booleanArgumentWithValue = arg } + } + } else true + } arg.startsWith(argument.value + "=") -> { arg.substring(argument.value.length + 1) } @@ -213,6 +224,9 @@ fun validateArguments(errors: ArgumentParseErrors?): String? { if (errors.argumentWithoutValue != null) { return "No value passed for argument ${errors.argumentWithoutValue}" } + errors.booleanArgumentWithValue?.let { arg -> + return "No value expected for boolean argument ${arg.substringBefore('=')}. Please remove the value: $arg" + } if (errors.unknownArgs.isNotEmpty()) { return "Invalid argument: ${errors.unknownArgs.first()}" } diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.args b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.args new file mode 100644 index 00000000000..e47d58f3d08 --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/extraBooleanArgumentEqualsFalse.kt +-d +$TEMP_DIR$ +-Xallow-kotlin-package=false diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.kt b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.kt new file mode 100644 index 00000000000..c6c10d8046f --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.kt @@ -0,0 +1,3 @@ +package kotlin + +class X diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.out b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.out new file mode 100644 index 00000000000..39544409b6e --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.out @@ -0,0 +1,4 @@ +compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.kt:1:1: error: only the Kotlin standard library is allowed to use the 'kotlin' package +package kotlin +^ +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.args b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.args new file mode 100644 index 00000000000..c3020a1e50f --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/extraBooleanArgumentEqualsFalse.kt +-d +$TEMP_DIR$ +-Xallow-kotlin-package=nonsense diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.out b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.out new file mode 100644 index 00000000000..fbf8f06997f --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.out @@ -0,0 +1,3 @@ +error: no value expected for boolean argument -Xallow-kotlin-package. Please remove the value: -Xallow-kotlin-package=nonsense +info: use -help for more information +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.args b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.args new file mode 100644 index 00000000000..0211f2c6878 --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.args @@ -0,0 +1,4 @@ +$TESTDATA_DIR$/extraBooleanArgumentEqualsTrue.kt +-d +$TEMP_DIR$ +-Xallow-kotlin-package=true diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.kt b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.kt new file mode 100644 index 00000000000..c6c10d8046f --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.kt @@ -0,0 +1,3 @@ +package kotlin + +class X diff --git a/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.out b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.out new file mode 100644 index 00000000000..d86bac9de59 --- /dev/null +++ b/compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.out @@ -0,0 +1 @@ +OK diff --git a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java index a01074d2f65..5ac6aca9f72 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -281,6 +281,21 @@ public class CliTestGenerated extends AbstractCliTest { runTest("compiler/testData/cli/jvm/extraArgumentPassedInObsoleteForm.args"); } + @TestMetadata("extraBooleanArgumentEqualsFalse.args") + public void testExtraBooleanArgumentEqualsFalse() throws Exception { + runTest("compiler/testData/cli/jvm/extraBooleanArgumentEqualsFalse.args"); + } + + @TestMetadata("extraBooleanArgumentEqualsNonsense.args") + public void testExtraBooleanArgumentEqualsNonsense() throws Exception { + runTest("compiler/testData/cli/jvm/extraBooleanArgumentEqualsNonsense.args"); + } + + @TestMetadata("extraBooleanArgumentEqualsTrue.args") + public void testExtraBooleanArgumentEqualsTrue() throws Exception { + runTest("compiler/testData/cli/jvm/extraBooleanArgumentEqualsTrue.args"); + } + @TestMetadata("extraHelp.args") public void testExtraHelp() throws Exception { runTest("compiler/testData/cli/jvm/extraHelp.args");