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.messages.*
import org.jetbrains.kotlin.cli.common.repl.* import org.jetbrains.kotlin.cli.common.repl.*
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots 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.GenericReplCompiler
import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompilerState import org.jetbrains.kotlin.cli.jvm.repl.GenericReplCompilerState
import org.jetbrains.kotlin.config.CommonConfigurationKeys 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(PathUtil.getKotlinPathsForCompiler().let { listOf(it.runtimePath, it.reflectPath, it.scriptRuntimePath) })
addJvmClasspathRoots(templateClasspath) addJvmClasspathRoots(templateClasspath)
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script")
put(CommonConfigurationKeys.SKIP_METADATA_VERSION_CHECK, true)
} }
protected fun makeScriptDefinition(templateClasspath: List<File>, templateClassName: String): KotlinScriptDefinition? { 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.cli.jvm.repl.GenericReplCompiler
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration 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.KotlinScriptDefinition
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromAnnotatedTemplate
import org.jetbrains.kotlin.utils.PathUtil import org.jetbrains.kotlin.utils.PathUtil
@@ -71,5 +73,6 @@ class KotlinJsr223JvmLocalScriptEngine(
addJvmClasspathRoots(PathUtil.getJdkClassesRoots()) addJvmClasspathRoots(PathUtil.getJdkClassesRoots())
addJvmClasspathRoots(templateClasspath) addJvmClasspathRoots(templateClasspath)
put(CommonConfigurationKeys.MODULE_NAME, "kotlin-script") 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) } ?: manifestClassPath(classLoader)?.anyOrNull { it.matchMaybeVersionedFile(keyName) }
)?.toList() )?.toList()
private val validJarExtensions = setOf("jar", "zip")
private fun scriptCompilationClasspathFromContext(keyName: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader): List<File> = private fun scriptCompilationClasspathFromContext(keyName: String, classLoader: ClassLoader = Thread.currentThread().contextClassLoader): List<File> =
(System.getProperty("kotlin.script.classpath")?.split(File.pathSeparator)?.map(::File) (System.getProperty("kotlin.script.classpath")?.split(File.pathSeparator)?.map(::File)
@@ -84,9 +85,9 @@ private fun scriptCompilationClasspathFromContext(keyName: String, classLoader:
).let { ).let {
it?.plus(kotlinScriptStandardJars) ?: kotlinScriptStandardJars it?.plus(kotlinScriptStandardJars) ?: kotlinScriptStandardJars
} }
.map { it?.canonicalFile } .mapNotNull { it?.canonicalFile }
.distinct() .distinct()
.mapNotNull { it?.existsOrNull() } .filter { (it.isDirectory || (it.isFile && it.extension.toLowerCase() in validJarExtensions)) && it.exists() }
private val kotlinCompilerJar: File by lazy { private val kotlinCompilerJar: File by lazy {
// highest prio - explicit property // 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 org.jetbrains.kotlin.script.ScriptTemplateDefinition
import javax.script.Bindings import javax.script.Bindings
import javax.script.ScriptEngine import javax.script.ScriptEngine
import kotlin.script.templates.standard.ScriptTemplateWithBindings
@Suppress("unused") @Suppress("unused")
@ScriptTemplateDefinition @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 } 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? = fun eval(script: String, newBindings: Bindings): Any? =
withMyEngine { 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 newBindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = null
} }
val res = it.eval(script, newBindings) val res = it.eval(script, newBindings)
@@ -29,10 +30,10 @@ abstract class KotlinStandardJsr223ScriptTemplate(val bindings: Bindings) {
fun eval(script: String): Any? = fun eval(script: String): Any? =
withMyEngine { withMyEngine {
val savedState = bindings.remove(KOTLIN_SCRIPT_STATE_BINDINGS_KEY) val savedState = jsr223Bindings.remove(KOTLIN_SCRIPT_STATE_BINDINGS_KEY)
val res = it.eval(script, bindings) val res = it.eval(script, jsr223Bindings)
savedState?.apply { savedState?.apply {
bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = savedState jsr223Bindings[KOTLIN_SCRIPT_STATE_BINDINGS_KEY] = savedState
} }
res res
} }