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:
+19
-28
@@ -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())
|
||||
|
||||
+12
-9
@@ -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) =
|
||||
|
||||
Reference in New Issue
Block a user