mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-05-16 08:31:35 +00:00
Pass scripting (host) environment independently from properties/configuration
This commit is contained in:
@@ -24,6 +24,8 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
|
||||
|
||||
protected abstract val scriptDefinition: ScriptDefinition
|
||||
|
||||
protected abstract val hostEnvironment: ScriptingEnvironment
|
||||
|
||||
abstract val scriptFileExtensionWithDot: String
|
||||
|
||||
open val baseClass: KClass<*> by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
@@ -88,8 +90,8 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
|
||||
.orEmpty()
|
||||
|
||||
private val scriptingClassGetter by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
scriptDefinition.properties.getOrNull(ScriptingEnvironmentProperties.getScriptingClass)
|
||||
?: throw IllegalArgumentException("Expecting 'getScriptingClass' property in the scripting environment")
|
||||
hostEnvironment.getOrNull(ScriptingEnvironmentProperties.getScriptingClass)
|
||||
?: throw IllegalArgumentException("Expecting 'getScriptingClass' property in the scripting environment")
|
||||
}
|
||||
|
||||
private fun getScriptingClass(type: KotlinType) =
|
||||
@@ -102,7 +104,8 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
|
||||
|
||||
|
||||
class KotlinScriptDefinitionAdapterFromNewAPI(
|
||||
override val scriptDefinition: ScriptDefinition
|
||||
override val scriptDefinition: ScriptDefinition,
|
||||
override val hostEnvironment: ScriptingEnvironment
|
||||
) : KotlinScriptDefinitionAdapterFromNewAPIBase() {
|
||||
|
||||
override val name: String get() = scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.name) ?: super.name
|
||||
|
||||
@@ -34,19 +34,20 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
|
||||
messageCollector: MessageCollector
|
||||
) : this(loadAnnotationsFromClass(classBytes), className, classpath, messageCollector)
|
||||
|
||||
override val hostEnvironment: ScriptingEnvironment by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
ScriptingEnvironment(
|
||||
ScriptingEnvironmentProperties.configurationDependencies to listOf(JvmDependency(classpath)),
|
||||
ScriptingEnvironmentProperties.getScriptingClass to JvmGetScriptingClass()
|
||||
)
|
||||
}
|
||||
|
||||
override val scriptDefinition: ScriptDefinition by lazy(LazyThreadSafetyMode.PUBLICATION) {
|
||||
messageCollector.report(
|
||||
CompilerMessageSeverity.LOGGING,
|
||||
"Configure scripting: loading script definition class $className using classpath $classpath\n. ${Thread.currentThread().stackTrace}"
|
||||
)
|
||||
try {
|
||||
ScriptDefinitionFromAnnotatedBaseClass(
|
||||
KotlinType(className),
|
||||
ScriptingEnvironment(
|
||||
ScriptingEnvironmentProperties.configurationDependencies to listOf(JvmDependency(classpath)),
|
||||
ScriptingEnvironmentProperties.getScriptingClass to JvmGetScriptingClass()
|
||||
)
|
||||
)
|
||||
ScriptDefinitionFromAnnotatedBaseClass(KotlinType(className), hostEnvironment)
|
||||
} catch (ex: ClassNotFoundException) {
|
||||
messageCollector.report(CompilerMessageSeverity.ERROR, "Cannot find script definition class $className")
|
||||
InvalidScriptDefinition
|
||||
|
||||
@@ -274,13 +274,15 @@ private fun loadScriptDefinition(
|
||||
val cls = classLoader.loadClass(template)
|
||||
val def =
|
||||
if (cls.annotations.firstIsInstanceOrNull<KotlinScript>() != null) {
|
||||
val environment = ScriptingEnvironment(
|
||||
ScriptingEnvironmentProperties.getScriptingClass to JvmGetScriptingClass()
|
||||
)
|
||||
KotlinScriptDefinitionAdapterFromNewAPI(
|
||||
ScriptDefinitionFromAnnotatedBaseClass(
|
||||
KotlinType(cls.kotlin),
|
||||
ScriptingEnvironment(
|
||||
ScriptingEnvironmentProperties.getScriptingClass to JvmGetScriptingClass()
|
||||
)
|
||||
)
|
||||
environment
|
||||
),
|
||||
environment
|
||||
)
|
||||
} else {
|
||||
KotlinScriptDefinitionFromAnnotatedTemplate(cls.kotlin, scriptResolverEnv)
|
||||
|
||||
Reference in New Issue
Block a user