Refactor host configuration handling and script definition creation

so it is possible now to create custom host configuration with template
and all configurations are handled consistenly.
Also introduce and use new ScriptDefinition class wrapping compilation
and evaluation configurations, that could be consistenly created from a
template.
This commit is contained in:
Ilya Chernikov
2020-05-13 21:44:39 +02:00
parent 255ad47406
commit 4b032a14af
12 changed files with 246 additions and 159 deletions
@@ -8,14 +8,11 @@ package org.jetbrains.kotlin.scripting.definitions
import java.io.File
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.host.configurationDependencies
import kotlin.script.experimental.host.createCompilationConfigurationFromTemplate
import kotlin.script.experimental.host.createEvaluationConfigurationFromTemplate
import kotlin.script.experimental.host.*
import kotlin.script.experimental.jvm.JvmDependency
class LazyScriptDefinitionFromDiscoveredClass internal constructor(
baseHostConfiguration: ScriptingHostConfiguration,
private val baseHostConfiguration: ScriptingHostConfiguration,
private val annotationsFromAsm: ArrayList<BinAnnData>,
private val className: String,
private val classpath: List<File>,
@@ -30,31 +27,21 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
messageReporter: MessageReporter
) : this(baseHostConfiguration, loadAnnotationsFromClass(classBytes), className, classpath, messageReporter)
override val hostConfiguration: ScriptingHostConfiguration by lazy(LazyThreadSafetyMode.PUBLICATION) {
ScriptingHostConfiguration(baseHostConfiguration) {
configurationDependencies.append(JvmDependency(classpath))
}
}
private val configurations by lazy(LazyThreadSafetyMode.PUBLICATION) {
private val definition: kotlin.script.experimental.host.ScriptDefinition by lazy(LazyThreadSafetyMode.PUBLICATION) {
messageReporter(
ScriptDiagnostic.Severity.DEBUG,
"Configure scripting: loading script definition class $className using classpath $classpath\n. ${Thread.currentThread().stackTrace}"
)
try {
val compileCfg =
createCompilationConfigurationFromTemplate(
KotlinType(className),
hostConfiguration,
LazyScriptDefinitionFromDiscoveredClass::class
)
val evalCfg =
createEvaluationConfigurationFromTemplate(
KotlinType(className),
hostConfiguration,
LazyScriptDefinitionFromDiscoveredClass::class
)
compileCfg to evalCfg
createScriptDefinitionFromTemplate(
KotlinType(className),
baseHostConfiguration.with {
if (classpath.isNotEmpty()) {
configurationDependencies.append(JvmDependency(classpath))
}
},
LazyScriptDefinitionFromDiscoveredClass::class
)
} catch (ex: ClassNotFoundException) {
messageReporter(ScriptDiagnostic.Severity.ERROR, "Cannot find script definition class $className")
InvalidScriptDefinition
@@ -67,8 +54,11 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
}
}
override val compilationConfiguration: ScriptCompilationConfiguration get() = configurations.first
override val evaluationConfiguration: ScriptEvaluationConfiguration get() = configurations.second
override val hostConfiguration: ScriptingHostConfiguration
get() = definition.compilationConfiguration[ScriptCompilationConfiguration.hostConfiguration] ?: baseHostConfiguration
override val compilationConfiguration: ScriptCompilationConfiguration get() = definition.compilationConfiguration
override val evaluationConfiguration: ScriptEvaluationConfiguration get() = definition.evaluationConfiguration
override val fileExtension: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
annotationsFromAsm.find { it.name == KotlinScript::class.java.simpleName }?.args
@@ -84,4 +74,5 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
}
}
val InvalidScriptDefinition = ScriptCompilationConfiguration() to ScriptEvaluationConfiguration()
val InvalidScriptDefinition =
ScriptDefinition(ScriptCompilationConfiguration(), ScriptEvaluationConfiguration())
@@ -11,9 +11,7 @@ import org.jetbrains.kotlin.scripting.resolve.KotlinScriptDefinitionFromAnnotate
import java.io.File
import kotlin.reflect.KClass
import kotlin.script.experimental.api.*
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.host.createCompilationConfigurationFromTemplate
import kotlin.script.experimental.host.createEvaluationConfigurationFromTemplate
import kotlin.script.experimental.host.*
import kotlin.script.experimental.jvm.baseClassLoader
import kotlin.script.experimental.jvm.jvm
@@ -181,14 +179,19 @@ abstract class ScriptDefinition : UserDataHolderBase() {
) : FromConfigurationsBase()
open class FromTemplate(
hostConfiguration: ScriptingHostConfiguration,
private val baseHostConfiguration: ScriptingHostConfiguration,
template: KClass<*>,
contextClass: KClass<*> = ScriptCompilationConfiguration::class
) : FromConfigurations(
hostConfiguration,
createCompilationConfigurationFromTemplate(KotlinType(template), hostConfiguration, contextClass),
createEvaluationConfigurationFromTemplate(KotlinType(template), hostConfiguration, contextClass)
)
) : FromConfigurationsBase() {
private val definition = createScriptDefinitionFromTemplate(KotlinType(template), baseHostConfiguration, contextClass)
override val hostConfiguration: ScriptingHostConfiguration
get() = definition.compilationConfiguration[ScriptCompilationConfiguration.hostConfiguration] ?: baseHostConfiguration
override val compilationConfiguration: ScriptCompilationConfiguration get() = definition.compilationConfiguration
override val evaluationConfiguration: ScriptEvaluationConfiguration get() = definition.evaluationConfiguration
}
companion object {
fun getDefault(hostConfiguration: ScriptingHostConfiguration) =