diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/extensions/ScriptEvaluationExtension.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/common/extensions/ScriptEvaluationExtension.kt new file mode 100644 index 00000000000..e3c534701d6 --- /dev/null +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/extensions/ScriptEvaluationExtension.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.cli.common.extensions + +import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor + +interface ScriptEvaluationExtension { + companion object : ProjectExtensionDescriptor( + "org.jetbrains.kotlin.scriptEvaluationExtension", + ScriptEvaluationExtension::class.java + ) + + fun isAccepted(arguments: CommonCompilerArguments): Boolean + + // TODO: it would be nice to split KotlinCoreEnvironment to actual environment and compilation/project configuration + fun eval(arguments: CommonCompilerArguments, coreEnvironment: KotlinCoreEnvironment): ExitCode +} 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 be25751ee3d..e82c72ec7f3 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/K2JVMCompiler.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cli.common.* import org.jetbrains.kotlin.cli.common.ExitCode.* import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot +import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.FilteringMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector @@ -44,8 +45,6 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmMetadataVersion -import org.jetbrains.kotlin.script.ScriptDefinitionProvider -import org.jetbrains.kotlin.script.StandardScriptDefinition import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.PathUtil import java.io.File @@ -133,27 +132,16 @@ class K2JVMCompiler : CLICompiler() { val sourcePath = arguments.freeArgs.first() configuration.addKotlinSourceRoot(sourcePath) - configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) - val environment = createCoreEnvironment(rootDisposable, configuration, messageCollector) ?: return COMPILATION_ERROR - val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(environment.project) - if (scriptDefinitionProvider == null) { - messageCollector.report(ERROR, "Unable to process the script, scripting plugin is not configured") - return COMPILATION_ERROR - } - val scriptFile = File(sourcePath) - if (scriptFile.isDirectory || !scriptDefinitionProvider.isScript(scriptFile.name)) { - 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") + val scriptingEvaluator = ScriptEvaluationExtension.getInstances(environment.project).find { it.isAccepted(arguments) } + if (scriptingEvaluator == null) { + messageCollector.report(ERROR, "Unable to evaluate script, no scripting plugin found") return COMPILATION_ERROR } - val scriptArgs = arguments.freeArgs.subList(1, arguments.freeArgs.size) - return KotlinToJVMBytecodeCompiler.compileAndExecuteScript(environment, scriptArgs) + return scriptingEvaluator.eval(arguments, environment) } else { if (destination != null) { if (destination.endsWith(".jar")) { diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt index be53b95e09f..0122dad5b85 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinCoreEnvironment.kt @@ -74,6 +74,7 @@ import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PRO import org.jetbrains.kotlin.cli.common.config.ContentRoot import org.jetbrains.kotlin.cli.common.config.KotlinSourceRoot import org.jetbrains.kotlin.cli.common.config.kotlinSourceRoots +import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.STRONG_WARNING @@ -595,6 +596,7 @@ class KotlinCoreEnvironment private constructor( CompilerConfigurationExtension.registerExtensionPoint(project) CollectAdditionalSourcesExtension.registerExtensionPoint(project) IrGenerationExtension.registerExtensionPoint(project) + ScriptEvaluationExtension.registerExtensionPoint(project) } private fun registerApplicationServicesForCLI(applicationEnvironment: JavaCoreApplicationEnvironment) { diff --git a/compiler/testData/cli/jvm/wrongScriptWithDirectory.out b/compiler/testData/cli/jvm/wrongScriptWithDirectory.out index a753b1e58f4..820f313eee6 100644 --- a/compiler/testData/cli/jvm/wrongScriptWithDirectory.out +++ b/compiler/testData/cli/jvm/wrongScriptWithDirectory.out @@ -1,2 +1,2 @@ -error: specify path to the script file as the first argument +error: specify path to the script file (.kts) as the first argument COMPILATION_ERROR diff --git a/compiler/testData/cli/jvm/wrongScriptWithKtSource.out b/compiler/testData/cli/jvm/wrongScriptWithKtSource.out index a753b1e58f4..820f313eee6 100644 --- a/compiler/testData/cli/jvm/wrongScriptWithKtSource.out +++ b/compiler/testData/cli/jvm/wrongScriptWithKtSource.out @@ -1,2 +1,2 @@ -error: specify path to the script file as the first argument +error: specify path to the script file (.kts) as the first argument COMPILATION_ERROR diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/JvmCliScriptEvaluationExtension.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/JvmCliScriptEvaluationExtension.kt new file mode 100644 index 00000000000..148e39d3511 --- /dev/null +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/JvmCliScriptEvaluationExtension.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.scripting.compiler.plugin + +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.ExitCode +import org.jetbrains.kotlin.cli.common.ExitCode.COMPILATION_ERROR +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension +import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.ERROR +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.script.ScriptDefinitionProvider +import org.jetbrains.kotlin.script.StandardScriptDefinition +import java.io.File + +class JvmCliScriptEvaluationExtension : ScriptEvaluationExtension { + override fun isAccepted(arguments: CommonCompilerArguments): Boolean = + arguments is K2JVMCompilerArguments && arguments.script + + override fun eval(arguments: CommonCompilerArguments, coreEnvironment: KotlinCoreEnvironment): ExitCode { + val configuration = coreEnvironment.configuration + val messageCollector = configuration.getNotNull(CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY) + val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(coreEnvironment.project) + if (scriptDefinitionProvider == null) { + messageCollector.report(ERROR, "Unable to process the script, scripting plugin is not configured") + return COMPILATION_ERROR + } + val sourcePath = arguments.freeArgs.first() + val scriptFile = File(sourcePath) + if (scriptFile.isDirectory || !scriptDefinitionProvider.isScript(scriptFile.name)) { + 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 + } + configuration.put(JVMConfigurationKeys.RETAIN_OUTPUT_IN_MEMORY, true) + + val scriptArgs = arguments.freeArgs.subList(1, arguments.freeArgs.size) + return KotlinToJVMBytecodeCompiler.compileAndExecuteScript(coreEnvironment, scriptArgs) + } +} \ No newline at end of file diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt index 2e03021bc9e..1162f58b205 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/compiler/plugin/pluginRegisrar.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.compiler.plugin import com.intellij.mock.MockProject import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys +import org.jetbrains.kotlin.cli.common.extensions.ScriptEvaluationExtension import org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.extensions.CollectAdditionalSourcesExtension @@ -23,6 +24,7 @@ class ScriptingCompilerConfigurationComponentRegistrar : ComponentRegistrar { override fun registerProjectComponents(project: MockProject, configuration: CompilerConfiguration) { CompilerConfigurationExtension.registerExtension(project, ScriptingCompilerConfigurationExtension(project)) CollectAdditionalSourcesExtension.registerExtension(project, ScriptingCollectAdditionalSourcesExtension(project)) + ScriptEvaluationExtension.registerExtension(project, JvmCliScriptEvaluationExtension()) val scriptDefinitionProvider = CliScriptDefinitionProvider() project.registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider)