Pass scripting (host) environment independently from properties/configuration

This commit is contained in:
Ilya Chernikov
2018-07-15 22:23:49 +02:00
parent 91e6c0b77c
commit 8953bba47c
11 changed files with 49 additions and 43 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)