Skip metadata version check in repl, improve JSR 223 template compatibility

This commit is contained in:
Ilya Chernikov
2017-02-16 13:16:39 +03:00
parent a16f412b48
commit 6d9ecc60ef
4 changed files with 13 additions and 8 deletions
@@ -20,7 +20,6 @@ import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.cli.common.messages.*
import org.jetbrains.kotlin.cli.common.repl.*
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompiler
import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompilerState
import org.jetbrains.kotlin.config.CommonConfigurationKeys
@@ -54,6 +53,7 @@ open class KotlinJvmReplService(
addJvmClasspathRoots(PathUtil.getKotlinPathsForCompiler().let { listOf(it.runtimePath, it.reflectPath, it.scriptRuntimePath) })
addJvmClasspathRoots(templateClasspath)
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
put(CommonConfigurationKeys.SKIP_METADATA_VERSION_CHECK, true)
}
protected fun makeScriptDefinition(templateClasspath: List<File>, templateClassName: String): KotlinScriptDefinition? {
@@ -24,6 +24,8 @@ import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompiler
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.load.kotlin.JvmMetadataVersion
import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate
import org.jetbrains.kotlin.utils.PathUtil
@@ -71,5 +73,6 @@ class KotlinJsr223JvmLocalScriptEngine(
addJvmClasspathRoots(PathUtil.getJdkClassesRoots())
addJvmClasspathRoots(templateClasspath)
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
put(CommonConfigurationKeys.SKIP_METADATA_VERSION_CHECK, true)
}
}
@@ -77,6 +77,7 @@ private fun contextClasspath(keyName: String, classLoader: ClassLoader): List<Fi
?: manifestClassPath(classLoader)?.anyOrNull { it.matchMaybeVersionedFile(keyName) }
)?.toList()
private val validJarExtensions = setOf("jar", "zip")
private fun scriptCompilationClasspathFromContext(keyName: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader): List<File> =
(System.getProperty("kotlin.script.classpath")?.split(File.pathSeparator)?.map(::File)
@@ -84,9 +85,9 @@ private fun scriptCompilationClasspathFromContext(keyName: String, classLoader:
).let {
it?.plus(kotlinScriptStandardJars) ?: kotlinScriptStandardJars
}
.map { it?.canonicalFile }
.mapNotNull { it?.canonicalFile }
.distinct()
.mapNotNull { it?.existsOrNull() }
.filter { (it.isDirectory || (it.isFile && it.extension.toLowerCase() in validJarExtensions)) && it.exists() }
private val kotlinCompilerJar: File by lazy {
// highest prio - explicit property
@@ -5,10 +5,11 @@ import org.jetbrains.kotlin.cli.common.repl.KOTLIN_SCRIPT_STATE_BINDINGS_KEY
import org.jetbrains.kotlin.script.ScriptTemplateDefinition
import javax.script.Bindings
import javax.script.ScriptEngine
import kotlin.script.templates.standard.ScriptTemplateWithBindings
@Suppress("unused")
@ScriptTemplateDefinition
abstract class KotlinStandardJsr223ScriptTemplate(val bindings: Bindings) {
abstract class KotlinStandardJsr223ScriptTemplate(val jsr223Bindings: Bindings) : ScriptTemplateWithBindings(jsr223Bindings) {
private val myEngine: ScriptEngine? get() = bindings[KOTLIN_SCRIPT_ENGINE_BINDINGS_KEY]?.let { it as? ScriptEngine }
@@ -17,7 +18,7 @@ abstract class KotlinStandardJsr223ScriptTemplate(val bindings: Bindings) {
fun eval(script: String, newBindings: Bindings): Any? =
withMyEngine {
val savedState = newBindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY]?.takeIf { it === this.bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] }?.apply {
val savedState = newBindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY]?.takeIf { it === this.jsr223Bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] }?.apply {
newBindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = null
}
val res = it.eval(script, newBindings)
@@ -29,10 +30,10 @@ abstract class KotlinStandardJsr223ScriptTemplate(val bindings: Bindings) {
fun eval(script: String): Any? =
withMyEngine {
val savedState = bindings.remove(KOTLIN_SCRIPT_STATE_BINDINGS_KEY)
val res = it.eval(script, bindings)
val savedState = jsr223Bindings.remove(KOTLIN_SCRIPT_STATE_BINDINGS_KEY)
val res = it.eval(script, jsr223Bindings)
savedState?.apply {
bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = savedState
jsr223Bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = savedState
}
res
}