diff --git a/libraries/scripting/jsr223/build.gradle.kts b/libraries/scripting/jsr223/build.gradle.kts index dbca5b1b1da..f731cf67477 100644 --- a/libraries/scripting/jsr223/build.gradle.kts +++ b/libraries/scripting/jsr223/build.gradle.kts @@ -12,12 +12,14 @@ dependencies { compile(project(":kotlin-scripting-jvm")) compile(project(":kotlin-scripting-jvm-host")) compile(project(":kotlin-scripting-compiler")) - compileOnly(project(":compiler:cli")) + compileOnly(project(":compiler:cli-common")) compileOnly(project(":kotlin-reflect-api")) compileOnly(intellijCoreDep()) runtime(project(":kotlin-compiler")) runtime(project(":kotlin-reflect")) testCompile(commonDep("junit")) + testCompileOnly(project(":compiler:cli")) + testCompileOnly(project(":core:util.runtime")) } sourceSets { diff --git a/libraries/scripting/jsr223/resources/META-INF/services/javax.script.ScriptEngineFactory b/libraries/scripting/jsr223/resources/META-INF/services/javax.script.ScriptEngineFactory index e461416460d..a8eb9a3704b 100644 --- a/libraries/scripting/jsr223/resources/META-INF/services/javax.script.ScriptEngineFactory +++ b/libraries/scripting/jsr223/resources/META-INF/services/javax.script.ScriptEngineFactory @@ -1,2 +1,2 @@ -kotlin.script.experimental.jsr223.KotlinJsr223JvmScriptEngineFactory +kotlin.script.experimental.jsr223.KotlinJsr223DefaultScriptEngineFactory diff --git a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScript.kt b/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScript.kt index 0b36735aac8..0fe3705df3f 100644 --- a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScript.kt +++ b/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScript.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.cli.common.repl.KOTLIN_SCRIPT_STATE_BINDINGS_KEY import javax.script.Bindings import javax.script.ScriptEngine import kotlin.script.experimental.annotations.KotlinScript -import kotlin.script.templates.ScriptTemplateDefinition import kotlin.script.templates.standard.ScriptTemplateWithBindings @Suppress("unused") @@ -47,4 +46,4 @@ abstract class KotlinJsr223DefaultScript(val jsr223Bindings: Bindings) : ScriptT } fun createBindings(): Bindings = withMyEngine { it.createBindings() } -} \ No newline at end of file +} diff --git a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScriptEngineFactory.kt b/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScriptEngineFactory.kt new file mode 100644 index 00000000000..e805e4fd131 --- /dev/null +++ b/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223DefaultScriptEngineFactory.kt @@ -0,0 +1,33 @@ +/* + * 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 kotlin.script.experimental.jsr223 + +import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase +import javax.script.ScriptEngine +import kotlin.script.experimental.api.ScriptCompilationConfiguration +import kotlin.script.experimental.jvm.dependenciesFromCurrentContext +import kotlin.script.experimental.jvm.jvm +import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate +import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate +import kotlin.script.experimental.jvmhost.jsr223.KotlinJsr223ScriptEngineImpl + +class KotlinJsr223DefaultScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() { + + private val compilationConfiguration = createJvmCompilationConfigurationFromTemplate() + private val evaluationConfiguration = createJvmEvaluationConfigurationFromTemplate() + + override fun getScriptEngine(): ScriptEngine = + KotlinJsr223ScriptEngineImpl( + this, + ScriptCompilationConfiguration(compilationConfiguration) { + jvm { + dependenciesFromCurrentContext(wholeClasspath = true) + } + }, + evaluationConfiguration + ) +} + diff --git a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngineFactory.kt b/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngineFactory.kt deleted file mode 100644 index cea000cd89b..00000000000 --- a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngineFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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. - */ - -@file:Suppress("unused") - -// could be used externally in javax.script.ScriptEngineFactory META-INF file - -package kotlin.script.experimental.jsr223 - -import org.jetbrains.kotlin.cli.common.repl.KotlinJsr223JvmScriptEngineFactoryBase -import org.jetbrains.kotlin.cli.common.repl.ScriptArgsWithTypes -import javax.script.Bindings -import javax.script.ScriptContext -import javax.script.ScriptEngine - -class KotlinJsr223JvmScriptEngineFactory : KotlinJsr223JvmScriptEngineFactoryBase() { - - override fun getScriptEngine(): ScriptEngine = - KotlinJsr223ScriptEngine( - this, - { ctx, types -> ScriptArgsWithTypes(arrayOf(ctx.getBindings(ScriptContext.ENGINE_SCOPE)), types ?: emptyArray()) }, - arrayOf(Bindings::class) - ) -} - diff --git a/libraries/scripting/jsr223/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt b/libraries/scripting/jsr223/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt index 3b24c352e72..502381a1d7e 100644 --- a/libraries/scripting/jsr223/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt +++ b/libraries/scripting/jsr223/test/kotlin/script/experimental/jsr223/test/KotlinJsr223ScriptEngineIT.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.config.KotlinCompilerVersion import org.junit.Assert import org.junit.Test import javax.script.* -import kotlin.script.experimental.jsr223.KotlinJsr223ScriptEngine +import kotlin.script.experimental.jvmhost.jsr223.KotlinJsr223ScriptEngineImpl class KotlinJsr223ScriptEngineIT { @@ -44,7 +44,7 @@ class KotlinJsr223ScriptEngineIT { val factory = ScriptEngineManager().getEngineByExtension("kts").factory Assert.assertNotNull(factory) val engine = factory!!.scriptEngine - Assert.assertNotNull(engine as? KotlinJsr223ScriptEngine) + Assert.assertNotNull(engine as? KotlinJsr223ScriptEngineImpl) Assert.assertSame(factory, engine!!.factory) val bindings = engine.createBindings() Assert.assertTrue(bindings is SimpleBindings) @@ -89,7 +89,7 @@ class KotlinJsr223ScriptEngineIT { fun testEngineRepeatWithReset() { val code = "open class A {}\n" + "class B : A() {}" - val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngine + val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngineImpl val res1 = engine.eval(code) Assert.assertNull(res1) @@ -127,7 +127,7 @@ obj @Test fun testSimpleCompilable() { - val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngine + val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngineImpl val comp1 = engine.compile("val x = 3") val comp2 = engine.compile("x + 2") val res1 = comp1.eval() @@ -138,7 +138,7 @@ obj @Test fun testMultipleCompilable() { - val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngine + val engine = ScriptEngineManager().getEngineByExtension("kts") as KotlinJsr223ScriptEngineImpl val compiled1 = engine.compile("""listOf(1,2,3).joinToString(",")""") val compiled2 = engine.compile("""val x = bindings["boundValue"] as Int + bindings["z"] as Int""") val compiled3 = engine.compile("""x""") diff --git a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223InvocableScriptEngine.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt similarity index 98% rename from libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223InvocableScriptEngine.kt rename to libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt index a2a5f7ab62c..fc1b9d7f9f6 100644 --- a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223InvocableScriptEngine.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223InvocableScriptEngine.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package kotlin.script.experimental.jsr223 +package kotlin.script.experimental.jvmhost.jsr223 import org.jetbrains.kotlin.cli.common.repl.InvokeWrapper import org.jetbrains.kotlin.cli.common.repl.renderReplStackTrace diff --git a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngine.kt b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223ScriptEngineImpl.kt similarity index 58% rename from libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngine.kt rename to libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223ScriptEngineImpl.kt index bf0b42558b2..571192e0f71 100644 --- a/libraries/scripting/jsr223/src/kotlin/script/experimental/jsr223/KotlinJsr223ScriptEngine.kt +++ b/libraries/scripting/jvm-host/src/kotlin/script/experimental/jvmhost/jsr223/KotlinJsr223ScriptEngineImpl.kt @@ -1,39 +1,31 @@ /* - * 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. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package kotlin.script.experimental.jsr223 +package kotlin.script.experimental.jvmhost.jsr223 import org.jetbrains.kotlin.cli.common.repl.* import java.util.concurrent.locks.ReentrantReadWriteLock +import javax.script.Bindings import javax.script.ScriptContext import javax.script.ScriptEngineFactory -import kotlin.reflect.KClass +import kotlin.script.experimental.api.ScriptCompilationConfiguration import kotlin.script.experimental.api.ScriptEvaluationConfiguration import kotlin.script.experimental.jvm.baseClassLoader -import kotlin.script.experimental.jvm.dependenciesFromCurrentContext import kotlin.script.experimental.jvm.jvm -import kotlin.script.experimental.jvmhost.createJvmCompilationConfigurationFromTemplate -import kotlin.script.experimental.jvmhost.createJvmEvaluationConfigurationFromTemplate import kotlin.script.experimental.jvmhost.repl.JvmReplCompiler import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluator import kotlin.script.experimental.jvmhost.repl.JvmReplEvaluatorState -class KotlinJsr223ScriptEngine( +// TODO: reimplement without legacy REPL infrastructure + +class KotlinJsr223ScriptEngineImpl( factory: ScriptEngineFactory, - val getScriptArgs: (ScriptContext, Array>?) -> ScriptArgsWithTypes?, - val scriptArgsTypes: Array>? + val compilationConfiguration: ScriptCompilationConfiguration, + val evaluationConfiguration: ScriptEvaluationConfiguration ) : KotlinJsr223JvmScriptEngineBase(factory), KotlinJsr223InvocableScriptEngine { - val compilationConfiguration = createJvmCompilationConfigurationFromTemplate { - jvm { - dependenciesFromCurrentContext(wholeClasspath = true) - } - } - - val evaluationConfiguration = createJvmEvaluationConfigurationFromTemplate() - override val replCompiler: ReplCompiler by lazy { JvmReplCompiler(compilationConfiguration) } @@ -43,11 +35,12 @@ class KotlinJsr223ScriptEngine( override val replEvaluator: ReplFullEvaluator get() = localEvaluator - internal val state: IReplStageState<*> get() = getCurrentState(getContext()) + val state: IReplStageState<*> get() = getCurrentState(getContext()) override fun createState(lock: ReentrantReadWriteLock): IReplStageState<*> = replEvaluator.createState(lock) - override fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes? = getScriptArgs(context, scriptArgsTypes) + override fun overrideScriptArgs(context: ScriptContext): ScriptArgsWithTypes? = + ScriptArgsWithTypes(arrayOf(context.getBindings(ScriptContext.ENGINE_SCOPE).orEmpty()), arrayOf(Bindings::class)) override val invokeWrapper: InvokeWrapper? get() = null