diff --git a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java index 36e41963be1..2a08546962c 100644 --- a/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java +++ b/compiler/cli/cli-common/src/org/jetbrains/kotlin/cli/common/arguments/CommonCompilerArguments.java @@ -58,6 +58,8 @@ public abstract class CommonCompilerArguments { public List freeArgs = new SmartList(); + public List unknownExtraFlags = new SmartList(); + @NotNull public String executableScriptFileName() { return "kotlinc"; 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 bd887aaa712..ff48a4ce816 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/CLICompiler.java @@ -22,6 +22,9 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.SystemInfo; import com.sampullara.cli.Args; +import kotlin.Pair; +import kotlin.collections.CollectionsKt; +import kotlin.jvm.functions.Function1; import org.fusesource.jansi.AnsiConsole; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -87,7 +90,7 @@ public abstract class CLICompiler { private A parseArguments(@NotNull PrintStream errStream, @NotNull MessageRenderer messageRenderer, @NotNull String[] args) { try { A arguments = createArguments(); - arguments.freeArgs = Args.parse(arguments, args); + parseArguments(args, arguments); return arguments; } catch (IllegalArgumentException e) { @@ -104,6 +107,26 @@ public abstract class CLICompiler { return null; } + @SuppressWarnings("WeakerAccess") // Used in maven (see KotlinCompileMojoBase.java) + public void parseArguments(@NotNull String[] args, @NotNull A arguments) { + Pair, List> unparsedArgs = + CollectionsKt.partition(Args.parse(arguments, args, false), new Function1() { + @Override + public Boolean invoke(String s) { + return s.startsWith("-X"); + } + }); + + arguments.unknownExtraFlags = unparsedArgs.getFirst(); + arguments.freeArgs = unparsedArgs.getSecond(); + + for (String argument : arguments.freeArgs) { + if (argument.startsWith("-")) { + throw new IllegalArgumentException("Invalid argument: " + argument); + } + } + } + /** * Allow derived classes to add additional command line arguments */ @@ -169,6 +192,8 @@ public abstract class CLICompiler { messageCollector = new FilteringMessageCollector(messageCollector, Predicates.equalTo(CompilerMessageSeverity.WARNING)); } + reportUnknownExtraFlags(messageCollector, arguments); + GroupingMessageCollector groupingCollector = new GroupingMessageCollector(messageCollector); try { ExitCode exitCode = OK; @@ -226,6 +251,16 @@ public abstract class CLICompiler { } } + private void reportUnknownExtraFlags(@NotNull MessageCollector collector, @NotNull A arguments) { + for (String flag : arguments.unknownExtraFlags) { + collector.report( + CompilerMessageSeverity.WARNING, + "Flag is not supported by this version of the compiler: " + flag, + CompilerMessageLocation.NO_LOCATION + ); + } + } + @NotNull protected abstract ExitCode doExecute( @NotNull A arguments, diff --git a/compiler/testData/cli/jvm/unknownExtraFlags.args b/compiler/testData/cli/jvm/unknownExtraFlags.args new file mode 100644 index 00000000000..25538d6cb09 --- /dev/null +++ b/compiler/testData/cli/jvm/unknownExtraFlags.args @@ -0,0 +1,6 @@ +-Xabcdefghijklm +$TESTDATA_DIR$/simple.kt +-Xnopqrstuvwxyz +-d +$TEMP_DIR$ +-XXxxxxxxxxxxxx diff --git a/compiler/testData/cli/jvm/unknownExtraFlags.out b/compiler/testData/cli/jvm/unknownExtraFlags.out new file mode 100644 index 00000000000..bac1829ceb7 --- /dev/null +++ b/compiler/testData/cli/jvm/unknownExtraFlags.out @@ -0,0 +1,4 @@ +warning: flag is not supported by this version of the compiler: -Xabcdefghijklm +warning: flag is not supported by this version of the compiler: -Xnopqrstuvwxyz +warning: flag is not supported by this version of the compiler: -XXxxxxxxxxxxxx +OK diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 2cdfec4489d..cc45a2d6963 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -241,6 +241,12 @@ public class CliTestGenerated extends AbstractCliTest { doJvmTest(fileName); } + @TestMetadata("unknownExtraFlags.args") + public void testUnknownExtraFlags() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/unknownExtraFlags.args"); + doJvmTest(fileName); + } + @TestMetadata("version.args") public void testVersion() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/version.args"); diff --git a/libraries/tools/kotlin-maven-plugin-test/src/it/test-extraArguments/pom.xml b/libraries/tools/kotlin-maven-plugin-test/src/it/test-extraArguments/pom.xml index 6503940cdc4..236e839293d 100644 --- a/libraries/tools/kotlin-maven-plugin-test/src/it/test-extraArguments/pom.xml +++ b/libraries/tools/kotlin-maven-plugin-test/src/it/test-extraArguments/pom.xml @@ -74,6 +74,7 @@ -Xno-optimize -Xno-call-assertions -Xno-param-assertions + -Xunknown-extra-argument-abcdefghijklmnopqrstuvwxyz diff --git a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java index d7e99c2cc3e..172c556ba88 100644 --- a/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java +++ b/libraries/tools/kotlin-maven-plugin/src/main/java/org/jetbrains/kotlin/maven/K2JVMCompileMojo.java @@ -16,8 +16,6 @@ package org.jetbrains.kotlin.maven; -import com.intellij.util.ArrayUtil; -import com.sampullara.cli.Args; import kotlin.collections.CollectionsKt; import kotlin.jvm.functions.Function1; import org.apache.maven.artifact.Artifact; @@ -100,13 +98,6 @@ public class K2JVMCompileMojo extends KotlinCompileMojoBase e } A arguments = createCompilerArguments(); - configureCompilerArguments(arguments); - CLICompiler compiler = createCompiler(); + + configureCompilerArguments(arguments, compiler); printCompilerArgumentsIfDebugEnabled(arguments, compiler); MessageCollector messageCollector = new MessageCollector() { @@ -224,7 +223,7 @@ public abstract class KotlinCompileMojoBase e */ protected abstract void configureSpecificCompilerArguments(@NotNull A arguments) throws MojoExecutionException; - private void configureCompilerArguments(@NotNull A arguments) throws MojoExecutionException { + private void configureCompilerArguments(@NotNull A arguments, @NotNull CLICompiler compiler) throws MojoExecutionException { if (getLog().isDebugEnabled()) { arguments.verbose = true; } @@ -245,18 +244,19 @@ public abstract class KotlinCompileMojoBase e arguments.suppressWarnings = nowarn; - arguments.freeArgs.addAll(sources); getLog().info("Compiling Kotlin sources from " + sources); configureSpecificCompilerArguments(arguments); try { - Args.parse(arguments, ArrayUtil.toStringArray(args)); + compiler.parseArguments(ArrayUtil.toStringArray(args), arguments); } catch (IllegalArgumentException e) { throw new MojoExecutionException(e.getMessage()); } + arguments.freeArgs.addAll(sources); + if (arguments.noInline) { getLog().info("Method inlining is turned off"); }