Improve class name generation for scripts and REPL snippets
- allow to override default name/scheme - implement host/engine specific names for jsr223 to avoid classloading clashes (also fix "eval in eval" test)
This commit is contained in:
+13
-3
@@ -9,9 +9,7 @@ import org.jetbrains.kotlin.cli.common.repl.*
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||
import javax.script.ScriptContext
|
||||
import javax.script.ScriptEngineFactory
|
||||
import kotlin.script.experimental.api.ScriptCompilationConfiguration
|
||||
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
|
||||
import kotlin.script.experimental.api.hostConfiguration
|
||||
import kotlin.script.experimental.api.*
|
||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||
import kotlin.script.experimental.host.withDefaultsFrom
|
||||
import kotlin.script.experimental.jvm.baseClassLoader
|
||||
@@ -42,6 +40,18 @@ class KotlinJsr223ScriptEngineImpl(
|
||||
val compilationConfiguration by lazy {
|
||||
ScriptCompilationConfiguration(baseCompilationConfiguration) {
|
||||
hostConfiguration.update { it.withDefaultsFrom(jsr223HostConfiguration) }
|
||||
repl {
|
||||
// Snippet classes should be named uniquely, to avoid classloading clashes in the "eval in eval" scenario
|
||||
// TODO: consider applying the logic for any REPL, alternatively - develop other naming scheme to avoid clashes
|
||||
makeSnippetIdentifier { configuration, snippetId ->
|
||||
val scriptContext: ScriptContext? = configuration[ScriptCompilationConfiguration.jsr223.getScriptContext]?.invoke()
|
||||
val engineState = scriptContext?.let {
|
||||
it.getBindings(ScriptContext.ENGINE_SCOPE)?.get(KOTLIN_SCRIPT_STATE_BINDINGS_KEY)
|
||||
}
|
||||
if (engineState == null) makeDefaultSnippetIdentifier(snippetId)
|
||||
else "ScriptingHost${System.identityHashCode(engineState).toString(16)}_${makeDefaultSnippetIdentifier(snippetId)}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -74,7 +74,10 @@ internal class SourceCodeFromReplCodeLine(
|
||||
compilationConfiguration: ScriptCompilationConfiguration
|
||||
) : SourceCode {
|
||||
override val text: String get() = codeLine.code
|
||||
override val name: String = "${makeScriptBaseName(codeLine)}.${compilationConfiguration[ScriptCompilationConfiguration.fileExtension]}"
|
||||
override val name: String =
|
||||
"${compilationConfiguration[ScriptCompilationConfiguration.repl.makeSnippetIdentifier]!!(
|
||||
compilationConfiguration, ReplSnippetIdImpl(codeLine.no, codeLine.generation, 0)
|
||||
)}.${compilationConfiguration[ScriptCompilationConfiguration.fileExtension]}"
|
||||
override val locationId: String? = null
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user