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 714ad14133f..7ec20ed2304 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.javac.JavacWrapper import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate +import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.util.PerformanceCounter import org.jetbrains.kotlin.utils.KotlinPaths @@ -88,14 +89,7 @@ class K2JVMCompiler : CLICompiler() { return INTERNAL_ERROR } - if (arguments.script) { - if (arguments.freeArgs.isEmpty()) { - messageCollector.report(ERROR, "Specify script source path to evaluate") - return COMPILATION_ERROR - } - configuration.addKotlinSourceRoot(arguments.freeArgs[0]) - } - else if (arguments.module == null) { + if (!arguments.script && arguments.module == null) { for (arg in arguments.freeArgs) { val file = File(arg) if (file.extension == JavaFileType.DEFAULT_EXTENSION) { @@ -116,6 +110,10 @@ class K2JVMCompiler : CLICompiler() { configuration.put(CommonConfigurationKeys.MODULE_NAME, arguments.moduleName ?: JvmAbi.DEFAULT_MODULE_NAME) if (arguments.module == null && arguments.freeArgs.isEmpty() && !arguments.version) { + if (arguments.script) { + messageCollector.report(ERROR, "Specify script source path to evaluate") + return COMPILATION_ERROR + } ReplFromTerminal.run(rootDisposable, configuration) return ExitCode.OK } @@ -174,13 +172,26 @@ class K2JVMCompiler : CLICompiler() { KotlinToJVMBytecodeCompiler.compileModules(environment, directory) } else if (arguments.script) { - val scriptArgs = arguments.freeArgs.subList(1, arguments.freeArgs.size) + val sourcePath = arguments.freeArgs.first() + configuration.addKotlinSourceRoot(sourcePath) configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) val environment = createEnvironmentWithScriptingSupport(rootDisposable, configuration, arguments, messageCollector) ?: return COMPILATION_ERROR + val scriptDefinitionProvider = KotlinScriptDefinitionProvider.getInstance(environment.project)!! + val scriptFile = File(sourcePath) + if (scriptFile.isDirectory || !scriptDefinitionProvider.isScript(scriptFile)) { + val extensionHint = + if (configuration.get(JVMConfigurationKeys.SCRIPT_DEFINITIONS) == listOf(StandardScriptDefinition)) " (.kts)" + else "" + messageCollector.report(ERROR, "Specify path to the script file$extensionHint as the first argument") + return COMPILATION_ERROR + } + + val scriptArgs = arguments.freeArgs.subList(1, arguments.freeArgs.size) + return KotlinToJVMBytecodeCompiler.compileAndExecuteScript(environment, paths, scriptArgs) } else { diff --git a/compiler/testData/cli/jvm/wrongScriptWithDirectory.args b/compiler/testData/cli/jvm/wrongScriptWithDirectory.args new file mode 100644 index 00000000000..c9258d4d60a --- /dev/null +++ b/compiler/testData/cli/jvm/wrongScriptWithDirectory.args @@ -0,0 +1,2 @@ +-script +$TESTDATA_DIR$/wrongAbiVersionLib diff --git a/compiler/testData/cli/jvm/wrongScriptWithDirectory.out b/compiler/testData/cli/jvm/wrongScriptWithDirectory.out new file mode 100644 index 00000000000..820f313eee6 --- /dev/null +++ b/compiler/testData/cli/jvm/wrongScriptWithDirectory.out @@ -0,0 +1,2 @@ +error: specify path to the script file (.kts) as the first argument +COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/wrongScriptWithKtSource.args b/compiler/testData/cli/jvm/wrongScriptWithKtSource.args new file mode 100644 index 00000000000..03f5356817c --- /dev/null +++ b/compiler/testData/cli/jvm/wrongScriptWithKtSource.args @@ -0,0 +1,2 @@ +-script +$TESTDATA_DIR$/simple.kt diff --git a/compiler/testData/cli/jvm/wrongScriptWithKtSource.out b/compiler/testData/cli/jvm/wrongScriptWithKtSource.out new file mode 100644 index 00000000000..820f313eee6 --- /dev/null +++ b/compiler/testData/cli/jvm/wrongScriptWithKtSource.out @@ -0,0 +1,2 @@ +error: specify path to the script file (.kts) as the first argument +COMPILATION_ERROR diff --git a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java index 46de7c0904f..9988fb6f2d3 100644 --- a/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cli/CliTestGenerated.java @@ -416,6 +416,18 @@ public class CliTestGenerated extends AbstractCliTest { doJvmTest(fileName); } + @TestMetadata("wrongScriptWithDirectory.args") + public void testWrongScriptWithDirectory() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/wrongScriptWithDirectory.args"); + doJvmTest(fileName); + } + + @TestMetadata("wrongScriptWithKtSource.args") + public void testWrongScriptWithKtSource() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/wrongScriptWithKtSource.args"); + doJvmTest(fileName); + } + @TestMetadata("wrongScriptWithNoSource.args") public void testWrongScriptWithNoSource() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cli/jvm/wrongScriptWithNoSource.args");