Add basic bindings support to IDEA JSR223 scripting, fix evaluator

This commit is contained in:
Ilya Chernikov
2016-09-23 15:37:36 +02:00
parent bdaaf4fb09
commit bf0d5b6237
4 changed files with 37 additions and 7 deletions
@@ -22,7 +22,10 @@ import org.jetbrains.kotlin.cli.common.repl.GenericReplCompiledEvaluator
import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine
import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult
import org.jetbrains.kotlin.cli.common.repl.ReplEvalResult
import org.jetbrains.kotlin.daemon.client.*
import org.jetbrains.kotlin.daemon.client.DaemonReportMessage
import org.jetbrains.kotlin.daemon.client.DaemonReportingTargets
import org.jetbrains.kotlin.daemon.client.KotlinCompilerClient
import org.jetbrains.kotlin.daemon.client.KotlinRemoteReplCompiler
import org.jetbrains.kotlin.daemon.common.*
import org.jetbrains.kotlin.utils.PathUtil
import java.io.File
@@ -34,7 +37,7 @@ class KotlinJvmJsr223ScriptEngine4Idea(
private val factory: ScriptEngineFactory,
templateClasspath: List<File>,
templateClassName: String,
scriptArgs: Array<Any?>?,
getScriptArgs: (ScriptContext) -> Array<Any?>?,
scriptArgsTypes: Array<Class<*>>?
) : AbstractScriptEngine(), ScriptEngine {
@@ -63,7 +66,8 @@ class KotlinJvmJsr223ScriptEngine4Idea(
}
}
val localEvaluator by lazy { GenericReplCompiledEvaluator(emptyList(), Thread.currentThread().contextClassLoader, scriptArgs, scriptArgsTypes) }
// TODO: bindings passing works only once on the first eval, subsequent setContext/setBindings call have no effect. Consider making it dynamic, but take history into account
val localEvaluator by lazy { GenericReplCompiledEvaluator(templateClasspath, Thread.currentThread().contextClassLoader, getScriptArgs(getContext()), scriptArgsTypes) }
private var lineCount = 0
@@ -19,6 +19,8 @@ package org.jetbrains.kotlin.jsr223
import com.intellij.openapi.util.Disposer
import org.jetbrains.kotlin.cli.common.KotlinVersion
import org.jetbrains.kotlin.utils.PathUtil
import javax.script.Bindings
import javax.script.ScriptContext
import javax.script.ScriptEngine
import javax.script.ScriptEngineFactory
@@ -38,9 +40,14 @@ class KotlinJvmJsr223StandardScriptEngineFactory4Idea : ScriptEngineFactory {
Disposer.newDisposable(),
this,
listOf(PathUtil.getKotlinPathsForIdeaPlugin().runtimePath),
"kotlin.script.StandardScriptTemplate",
arrayOf(emptyArray<String>()),
null)
"kotlin.script.ScriptTemplateWithArgsAndBindings",
{ ctx ->
val bindings = ctx.getBindings(ScriptContext.ENGINE_SCOPE)
arrayOf(
(bindings[ScriptEngine.ARGV] as? Array<*>) ?: emptyArray<String>(),
bindings) },
arrayOf(Array<String>::class.java, java.util.Map::class.java)
)
override fun getOutputStatement(toDisplay: String?): String = "print(\"$toDisplay\")"
override fun getMethodCallSyntax(obj: String, m: String, vararg args: String): String = "$obj.$m(${args.joinToString()})"