Make script definition a property bag directly

This commit is contained in:
Ilya Chernikov
2018-07-15 22:56:02 +02:00
parent 8953bba47c
commit 904917c194
12 changed files with 66 additions and 103 deletions

View File

@@ -29,13 +29,13 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
abstract val scriptFileExtensionWithDot: String
open val baseClass: KClass<*> by lazy(LazyThreadSafetyMode.PUBLICATION) {
getScriptingClass(scriptDefinition.properties[ScriptDefinitionProperties.baseClass])
getScriptingClass(scriptDefinition[ScriptDefinitionProperties.baseClass])
}
override val template: KClass<*> get() = baseClass
override val name: String
get() = scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.name) ?: "Kotlin Script"
get() = scriptDefinition.getOrNull(ScriptDefinitionProperties.name) ?: "Kotlin Script"
override val fileType: LanguageFileType = KotlinFileType.INSTANCE
@@ -51,28 +51,28 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
get() = emptyList()
override val dependencyResolver: DependenciesResolver by lazy(LazyThreadSafetyMode.PUBLICATION) {
BridgeDependenciesResolver(scriptDefinition, scriptDefinition.properties)
BridgeDependenciesResolver(scriptDefinition, scriptDefinition)
}
override val acceptedAnnotations: List<KClass<out Annotation>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.refineConfigurationOnAnnotations)
scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.refineConfigurationOnAnnotations)
.orEmpty()
.map { getScriptingClass(it) as KClass<out Annotation> }
}
override val implicitReceivers: List<KType> by lazy(LazyThreadSafetyMode.PUBLICATION) {
scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.scriptImplicitReceivers)
scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.scriptImplicitReceivers)
.orEmpty()
.map { getScriptingClass(it).starProjectedType }
}
override val environmentVariables: List<Pair<String, KType>> by lazy(LazyThreadSafetyMode.PUBLICATION) {
scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.contextVariables)
scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.contextVariables)
?.map { (k, v) -> k to getScriptingClass(v).starProjectedType }.orEmpty()
}
override val additionalCompilerArguments: List<String>
get() = scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.compilerOptions)
get() = scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.compilerOptions)
.orEmpty()
override val scriptExpectedLocations: List<ScriptExpectedLocation> =
@@ -82,11 +82,11 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
)
override val targetClassAnnotations: List<Annotation>
get() = scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.generatedClassAnnotations)
get() = scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.generatedClassAnnotations)
.orEmpty()
override val targetMethodAnnotations: List<Annotation>
get() = scriptDefinition.properties.getOrNull(ScriptCompileConfigurationProperties.generatedMethodAnnotations)
get() = scriptDefinition.getOrNull(ScriptCompileConfigurationProperties.generatedMethodAnnotations)
.orEmpty()
private val scriptingClassGetter by lazy(LazyThreadSafetyMode.PUBLICATION) {
@@ -98,7 +98,7 @@ abstract class KotlinScriptDefinitionAdapterFromNewAPIBase : KotlinScriptDefinit
scriptingClassGetter(
type,
KotlinScriptDefinition::class, // Assuming that the KotlinScriptDefinition class is loaded in the proper classloader
scriptDefinition.properties
scriptDefinition
)
}
@@ -108,8 +108,8 @@ class KotlinScriptDefinitionAdapterFromNewAPI(
override val hostEnvironment: ScriptingEnvironment
) : KotlinScriptDefinitionAdapterFromNewAPIBase() {
override val name: String get() = scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.name) ?: super.name
override val name: String get() = scriptDefinition.getOrNull(ScriptDefinitionProperties.name) ?: super.name
override val scriptFileExtensionWithDot =
"." + (scriptDefinition.properties.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts")
"." + (scriptDefinition.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts")
}

View File

@@ -16,7 +16,7 @@ import java.io.File
import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.annotations.KotlinScriptFileExtension
import kotlin.script.experimental.api.*
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.definitions.createScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.jvm.JvmDependency
import kotlin.script.experimental.jvm.JvmGetScriptingClass
@@ -47,7 +47,11 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
"Configure scripting: loading script definition class $className using classpath $classpath\n. ${Thread.currentThread().stackTrace}"
)
try {
ScriptDefinitionFromAnnotatedBaseClass(KotlinType(className), hostEnvironment)
createScriptDefinitionFromAnnotatedBaseClass(
KotlinType(className),
hostEnvironment,
LazyScriptDefinitionFromDiscoveredClass::class
)
} catch (ex: ClassNotFoundException) {
messageCollector.report(CompilerMessageSeverity.ERROR, "Cannot find script definition class $className")
InvalidScriptDefinition
@@ -62,19 +66,16 @@ class LazyScriptDefinitionFromDiscoveredClass internal constructor(
override val scriptFileExtensionWithDot: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
val ext = annotationsFromAsm.find { it.name == KotlinScriptFileExtension::class.simpleName!! }?.args?.first()
?: scriptDefinition.properties.let {
it.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts"
}
?: scriptDefinition.let {
it.getOrNull(ScriptDefinitionProperties.fileExtension) ?: "kts"
}
".$ext"
}
override val name: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
annotationsFromAsm.find { it.name == KotlinScript::class.simpleName!! }?.args?.first()
?: super.name
?: super.name
}
}
object InvalidScriptDefinition : ScriptDefinition {
override val properties: ScriptDefinitionPropertiesBag = ScriptDefinitionPropertiesBag()
}
object InvalidScriptDefinition : ScriptDefinition()

View File

@@ -20,7 +20,7 @@ import kotlin.script.experimental.annotations.KotlinScript
import kotlin.script.experimental.api.KotlinType
import kotlin.script.experimental.api.ScriptingEnvironment
import kotlin.script.experimental.api.ScriptingEnvironmentProperties
import kotlin.script.experimental.definitions.ScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.definitions.createScriptDefinitionFromAnnotatedBaseClass
import kotlin.script.experimental.jvm.JvmGetScriptingClass
import kotlin.script.templates.ScriptTemplateDefinition
@@ -278,9 +278,10 @@ private fun loadScriptDefinition(
ScriptingEnvironmentProperties.getScriptingClass to JvmGetScriptingClass()
)
KotlinScriptDefinitionAdapterFromNewAPI(
ScriptDefinitionFromAnnotatedBaseClass(
createScriptDefinitionFromAnnotatedBaseClass(
KotlinType(cls.kotlin),
environment
environment,
KotlinScriptDefinition::class
),
environment
)