diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt index 21609d82575..cecdb4880dd 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/ScriptDefinitionsManager.kt @@ -40,6 +40,8 @@ import kotlin.concurrent.read import kotlin.concurrent.write import kotlin.script.dependencies.Environment import kotlin.script.dependencies.ScriptContents +import kotlin.script.experimental.api.ScriptingEnvironment +import kotlin.script.experimental.api.ScriptingEnvironmentParams import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass import kotlin.script.experimental.dependencies.DependenciesResolver import kotlin.script.experimental.dependencies.ScriptDependencies @@ -162,7 +164,9 @@ fun loadDefinitionsFromTemplates( ) } template.annotations.firstIsInstanceOrNull() != null -> { - KotlinScriptDefinitionAdapterFromNewAPI(ScriptDefinitionFromAnnotatedBaseClass(template)) + KotlinScriptDefinitionAdapterFromNewAPI( + ScriptDefinitionFromAnnotatedBaseClass(ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to template)) + ) } else -> { LOG.error("[kts] cannot find a valid script definition annotation on the class $template") diff --git a/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt b/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt index 3160e0e1861..6d41188051b 100644 --- a/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt +++ b/libraries/examples/scripting/jvm-maven-deps/host/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/host/host.kt @@ -8,10 +8,7 @@ package org.jetbrains.kotlin.script.examples.jvm.resolve.maven.host import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.MyScriptWithMavenDeps import org.jetbrains.kotlin.script.examples.jvm.resolve.maven.myJvmConfig import java.io.File -import kotlin.script.experimental.api.EvaluationResult -import kotlin.script.experimental.api.ResultWithDiagnostics -import kotlin.script.experimental.api.ScriptEvaluationEnvironment -import kotlin.script.experimental.api.toConfigEntry +import kotlin.script.experimental.api.* import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass import kotlin.script.experimental.host.toScriptSource import kotlin.script.experimental.jvm.DummyCompiledJvmScriptCache @@ -21,12 +18,14 @@ import kotlin.script.experimental.jvmhost.impl.KJVMCompilerImpl fun evalFile(scriptFile: File): ResultWithDiagnostics { val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache()) - val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScriptWithMavenDeps::class) + val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass( + ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to MyScriptWithMavenDeps::class) + ) val host = JvmBasicScriptingHost( - scriptDefinition.configurator, + scriptDefinition.compilationConfigurator, scriptCompiler, - scriptDefinition.runner + scriptDefinition.evaluator ) return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) diff --git a/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt b/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt index a3d1b2855de..f1b3963841e 100644 --- a/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt +++ b/libraries/examples/scripting/jvm-maven-deps/script/src/org/jetbrains/kotlin/script/examples/jvm/resolve/maven/scriptDef.kt @@ -10,20 +10,18 @@ import org.jetbrains.kotlin.script.util.FilesAndMavenResolver import org.jetbrains.kotlin.script.util.Repository import org.jetbrains.kotlin.script.util.scriptCompilationClasspathFromContext import java.io.File -import kotlin.reflect.KClass import kotlin.script.dependencies.ScriptContents import kotlin.script.dependencies.ScriptDependenciesResolver import kotlin.script.experimental.annotations.KotlinScript +import kotlin.script.experimental.annotations.KotlinScriptCompilationConfigurator +import kotlin.script.experimental.annotations.KotlinScriptEvaluator import kotlin.script.experimental.api.* -import kotlin.script.experimental.basic.DefaultScriptSelector import kotlin.script.experimental.jvm.* -import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner +import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator -@KotlinScript( - DefaultScriptSelector::class, - MyConfigurator::class, - BasicJvmScriptRunner::class -) +@KotlinScript +@KotlinScriptCompilationConfigurator(MyConfigurator::class) +@KotlinScriptEvaluator(BasicJvmScriptEvaluator::class) abstract class MyScriptWithMavenDeps { // abstract fun body(vararg args: String): Int } @@ -44,12 +42,16 @@ inline fun myJvmConfig( body() } -class MyConfigurator(val baseClass: KClass? = null) : ScriptConfigurator { +class MyConfigurator(val environment: ScriptingEnvironment) : ScriptCompilationConfigurator { private val resolver = FilesAndMavenResolver() - override suspend fun baseConfiguration(scriptSource: ScriptSource?): ResultWithDiagnostics = - myJvmConfig { add(scriptSource.toConfigEntry()) }.asSuccess() + override val defaultConfiguration = myJvmConfig { + add(ScriptCompileConfigurationParams.baseClass to environment[ScriptingEnvironmentParams.baseClass]) + } + + override suspend fun baseConfiguration(scriptSource: ScriptSource): ResultWithDiagnostics = + myJvmConfig(defaultConfiguration) { add(scriptSource.toConfigEntry()) }.asSuccess() override suspend fun refineConfiguration( configuration: ScriptCompileConfiguration, diff --git a/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt b/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt index e4bd999cd58..ae5ac19087b 100644 --- a/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt +++ b/libraries/examples/scripting/jvm-simple-script/host/src/org/jetbrains/kotlin/script/examples/jvm/simple/host/host.kt @@ -25,12 +25,14 @@ inline fun myJvmConfig( fun evalFile(scriptFile: File): ResultWithDiagnostics { val scriptCompiler = JvmScriptCompiler(KJVMCompilerImpl(), DummyCompiledJvmScriptCache()) - val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass(MyScript::class) + val scriptDefinition = ScriptDefinitionFromAnnotatedBaseClass( + ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to MyScript::class) + ) val host = JvmBasicScriptingHost( - scriptDefinition.configurator, + scriptDefinition.compilationConfigurator, scriptCompiler, - scriptDefinition.runner + scriptDefinition.evaluator ) return host.eval(myJvmConfig { add(scriptFile.toScriptSource().toConfigEntry()) }, ScriptEvaluationEnvironment()) diff --git a/libraries/examples/scripting/jvm-simple-script/script/src/org/jetbrains/kotlin/script/examples/jvm/simple/scriptDef.kt b/libraries/examples/scripting/jvm-simple-script/script/src/org/jetbrains/kotlin/script/examples/jvm/simple/scriptDef.kt index df103cbe63c..9792bf84b40 100644 --- a/libraries/examples/scripting/jvm-simple-script/script/src/org/jetbrains/kotlin/script/examples/jvm/simple/scriptDef.kt +++ b/libraries/examples/scripting/jvm-simple-script/script/src/org/jetbrains/kotlin/script/examples/jvm/simple/scriptDef.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.script.examples.jvm.simple import kotlin.script.experimental.annotations.KotlinScript -import kotlin.script.experimental.basic.DefaultScriptSelector -import kotlin.script.experimental.basic.PassThroughConfigurator -import kotlin.script.experimental.jvm.runners.BasicJvmScriptRunner +import kotlin.script.experimental.annotations.KotlinScriptEvaluator +import kotlin.script.experimental.jvm.runners.BasicJvmScriptEvaluator -@KotlinScript(DefaultScriptSelector::class, PassThroughConfigurator::class, BasicJvmScriptRunner::class) +@KotlinScript +@KotlinScriptEvaluator(BasicJvmScriptEvaluator::class) abstract class MyScript { // abstract fun body(vararg args: String): Int } diff --git a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt index 0b985b0c235..7f9dfb56c22 100644 --- a/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/impl/KJVMCompilerImpl.kt @@ -70,7 +70,7 @@ class KJVMCompilerImpl : KJVMCompilerProxy { override fun compile( scriptCompilerConfiguration: ScriptCompileConfiguration, - configurator: ScriptConfigurator? + configurator: ScriptCompilationConfigurator? ): ResultWithDiagnostics> { val messageCollector = ScriptDiagnosticsMessageCollector() @@ -238,7 +238,7 @@ class ScriptDiagnosticsMessageCollector : MessageCollector { internal class BridgeScriptDefinition( scriptCompilerConfiguration: ScriptCompileConfiguration, - scriptConfigurator: ScriptConfigurator?, + scriptConfigurator: ScriptCompilationConfigurator?, updateClasspath: (List) -> Unit ) : KotlinScriptDefinition(scriptCompilerConfiguration[ScriptCompileConfigurationParams.scriptSignature].scriptBase as KClass) { override val acceptedAnnotations = diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt index c3b9f308685..3ac61b66c65 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/impl/BridgeDependenciesResolver.kt @@ -21,7 +21,7 @@ import kotlin.script.experimental.jvm.mapToLegacyScriptReportPosition import kotlin.script.experimental.jvm.mapToLegacyScriptReportSeverity class BridgeDependenciesResolver( - val scriptConfigurator: ScriptConfigurator?, + val scriptConfigurator: ScriptCompilationConfigurator?, val baseScriptCompilerConfiguration: ScriptCompileConfiguration = scriptConfigurator.defaultConfiguration, val onClasspathUpdated: (List) -> Unit = {} ) : AsyncDependenciesResolver { diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt index 7cbc1f80fe3..3e3b5c01781 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptCompilation.kt @@ -14,7 +14,7 @@ open class JvmScriptCompiler( val cache: CompiledJvmScriptsCache ) : ScriptCompiler { - override suspend fun compile(configuration: ScriptCompileConfiguration, configurator: ScriptConfigurator?): ResultWithDiagnostics> { + override suspend fun compile(configuration: ScriptCompileConfiguration, configurator: ScriptCompilationConfigurator?): ResultWithDiagnostics> { val refinedConfiguration = configurator?.refineConfiguration(configuration)?.let { when (it) { is ResultWithDiagnostics.Failure -> return it @@ -42,7 +42,7 @@ interface CompiledJvmScriptsCache { interface KJVMCompilerProxy { fun compile( scriptCompilerConfiguration: ScriptCompileConfiguration, - configurator: ScriptConfigurator? + configurator: ScriptCompilationConfigurator? ): ResultWithDiagnostics> } diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptConfiguration.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptConfiguration.kt index a66c142bea9..9f048195c5e 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptConfiguration.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptConfiguration.kt @@ -19,5 +19,5 @@ inline fun jvmConfigWithJavaHome( body() } -val ScriptConfigurator?.defaultConfiguration: ScriptCompileConfiguration - get() = this?.let { runBlocking { baseConfiguration(null) } }?.resultOrNull() ?: ScriptCompileConfiguration() \ No newline at end of file +val ScriptCompilationConfigurator?.defaultConfiguration: ScriptCompileConfiguration + get() = this?.let { runBlocking { defaultConfiguration } } ?: ScriptCompileConfiguration() \ No newline at end of file diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptEvaluation.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptEvaluation.kt index e67be9682ac..dd548aac27e 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptEvaluation.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/jvmScriptEvaluation.kt @@ -11,10 +11,10 @@ import kotlin.script.experimental.api.* import kotlin.script.experimental.host.BasicScriptingHost open class JvmBasicScriptingHost( - configurationExtractor: ScriptConfigurator, + configurationExtractor: ScriptCompilationConfigurator, compiler: JvmScriptCompiler, - runner: ScriptRunner -) : BasicScriptingHost(configurationExtractor, compiler, runner) + evaluator: ScriptEvaluator +) : BasicScriptingHost(configurationExtractor, compiler, evaluator) class JvmScriptEvaluationEnvironmentParams : ScriptEvaluationEnvironmentParams() { companion object { diff --git a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptRunner.kt b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptEvaluator.kt similarity index 90% rename from libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptRunner.kt rename to libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptEvaluator.kt index d730245da93..3dce16cf58a 100644 --- a/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptRunner.kt +++ b/libraries/scripting/jvm/src/kotlin/script/experimental/jvm/runners/BasicJvmScriptEvaluator.kt @@ -5,12 +5,11 @@ package kotlin.script.experimental.jvm.runners -import kotlin.reflect.KClass import kotlin.script.experimental.api.* -open class BasicJvmScriptRunner(val baseClass: KClass? = null) : ScriptRunner { +open class BasicJvmScriptEvaluator(val environment: ScriptingEnvironment) : ScriptEvaluator { - override suspend fun run( + override suspend fun eval( compiledScript: CompiledScript, scriptEvaluationEnvironment: ScriptEvaluationEnvironment ): ResultWithDiagnostics = diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/KotlinScriptDefinitionAdapterFromNewAPI.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/KotlinScriptDefinitionAdapterFromNewAPI.kt index b2be4901852..ee6f9d1e5de 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/KotlinScriptDefinitionAdapterFromNewAPI.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/KotlinScriptDefinitionAdapterFromNewAPI.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.scripting.compiler.plugin import com.intellij.openapi.fileTypes.LanguageFileType -import kotlinx.coroutines.experimental.runBlocking import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NameUtils @@ -16,13 +15,14 @@ import kotlin.reflect.KClass import kotlin.reflect.KType import kotlin.script.experimental.api.ScriptCompileConfigurationParams import kotlin.script.experimental.api.ScriptDefinition -import kotlin.script.experimental.api.resultOrNull +import kotlin.script.experimental.api.ScriptDefinitionProperties import kotlin.script.experimental.dependencies.DependenciesResolver import kotlin.script.experimental.jvm.impl.BridgeDependenciesResolver -class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefinition) : KotlinScriptDefinition(scriptDefinition.baseClass) { +class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefinition) : + KotlinScriptDefinition(scriptDefinition.compilationConfigurator.defaultConfiguration[ScriptCompileConfigurationParams.baseClass]) { - override val name: String get() = scriptDefinition.selector.name + override val name: String get() = scriptDefinition.properties[ScriptDefinitionProperties.name] // TODO: consider creating separate type (subtype? for kotlin scripts) override val fileType: LanguageFileType = KotlinFileType.INSTANCE @@ -30,29 +30,28 @@ class KotlinScriptDefinitionAdapterFromNewAPI(val scriptDefinition: ScriptDefini override val annotationsForSamWithReceivers: List get() = emptyList() + private val scriptFileExtensionWithDot = + "." + (scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts") + override fun isScript(fileName: String): Boolean = - fileName.endsWith("." + scriptDefinition.selector.fileExtension) + fileName.endsWith(scriptFileExtensionWithDot) override fun getScriptName(script: KtScript): Name { val fileBasedName = NameUtils.getScriptNameForFile(script.containingKtFile.name) - return Name.identifier(scriptDefinition.selector.makeScriptName(fileBasedName.identifier)) + return Name.identifier(fileBasedName.identifier.removeSuffix(scriptFileExtensionWithDot)) } override val dependencyResolver: DependenciesResolver by lazy { - BridgeDependenciesResolver(scriptDefinition.configurator) + BridgeDependenciesResolver(scriptDefinition.compilationConfigurator) } override val acceptedAnnotations: List> by lazy { - runBlocking { - scriptDefinition.configurator.baseConfiguration(null) - }.resultOrNull()?.getOrNull(ScriptCompileConfigurationParams.updateConfigurationOnAnnotations)?.toList() - ?: emptyList() + scriptDefinition.compilationConfigurator.defaultConfiguration.getOrNull(ScriptCompileConfigurationParams.updateConfigurationOnAnnotations)?.toList() + ?: emptyList() } override val implicitReceivers: List by lazy { - runBlocking { - scriptDefinition.configurator.baseConfiguration(null) - }.resultOrNull()?.getOrNull(ScriptCompileConfigurationParams.scriptSignature)?.providedDeclarations?.implicitReceivers + scriptDefinition.compilationConfigurator.defaultConfiguration.getOrNull(ScriptCompileConfigurationParams.scriptSignature)?.providedDeclarations?.implicitReceivers ?: emptyList() } } diff --git a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt index 5dfcb4b7786..d1aa2c1509b 100644 --- a/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt +++ b/plugins/scripting/scripting-cli/src/org/jetbrains/kotlin/scripting/compiler/plugin/ScriptingCompilerConfigurationExtension.kt @@ -20,6 +20,8 @@ import java.io.File import java.io.IOException import java.net.URLClassLoader import java.util.jar.JarFile +import kotlin.script.experimental.api.ScriptingEnvironment +import kotlin.script.experimental.api.ScriptingEnvironmentParams import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass class ScriptingCompilerConfigurationExtension(val project: MockProject) : CompilerConfigurationExtension { @@ -124,7 +126,9 @@ fun configureScriptDefinitions( val cls = classloader.loadClass(template) val def = if (cls.annotations.firstIsInstanceOrNull() != null) { - KotlinScriptDefinitionAdapterFromNewAPI(ScriptDefinitionFromAnnotatedBaseClass(cls.kotlin)) + KotlinScriptDefinitionAdapterFromNewAPI( + ScriptDefinitionFromAnnotatedBaseClass(ScriptingEnvironment(ScriptingEnvironmentParams.baseClass to cls.kotlin)) + ) } else { KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, scriptResolverEnv) }