Add possibility to pass script dependency resolver directly rather than via definition annotation
This may help to reduce dependencies in certain situations
This commit is contained in:
@@ -36,10 +36,12 @@ import java.lang.reflect.Proxy
|
||||
import java.util.concurrent.Future
|
||||
import kotlin.reflect.*
|
||||
|
||||
const val DEFAULT_SCRIPT_FILE_PATTERN = "*.\\.kts"
|
||||
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
annotation class ScriptTemplateDefinition(val resolver: KClass<out ScriptDependenciesResolverEx> = BasicScriptDependenciesResolver::class,
|
||||
val scriptFilePattern: String = "*.\\.kts")
|
||||
val scriptFilePattern: String = DEFAULT_SCRIPT_FILE_PATTERN)
|
||||
|
||||
@Deprecated("Use ScriptTemplateDefinition")
|
||||
@Target(AnnotationTarget.CLASS)
|
||||
@@ -80,7 +82,10 @@ class BasicScriptDependenciesResolver : ScriptDependenciesResolverEx
|
||||
@Retention(AnnotationRetention.RUNTIME)
|
||||
annotation class AcceptedAnnotations(vararg val supportedAnnotationClasses: KClass<out Annotation>)
|
||||
|
||||
data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>, val environment: Map<String, Any?>?) : KotlinScriptDefinition {
|
||||
data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
||||
val resolver: ScriptDependenciesResolverEx? = null,
|
||||
val environment: Map<String, Any?>? = null
|
||||
) : KotlinScriptDefinition {
|
||||
|
||||
// TODO: remove this and simplify definitionAnnotation as soon as deprecated annotations will be removed
|
||||
internal class ScriptTemplateDefinitionData(val resolverClass: KClass<out ScriptDependenciesResolverEx>,
|
||||
@@ -119,12 +124,18 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>, val
|
||||
|
||||
private val definitionData by lazy {
|
||||
val defAnn = template.annotations.firstIsInstanceOrNull<ScriptTemplateDefinition>()
|
||||
if (defAnn == null) {
|
||||
val resolverAnn = template.annotations.firstIsInstanceOrNull<ScriptDependencyResolver>()
|
||||
val filePatternAnn = template.annotations.firstIsInstanceOrNull<ScriptFilePattern>()
|
||||
ScriptTemplateDefinitionData(ObsoleteResolverProxy::class, ObsoleteResolverProxy(resolverAnn), filePatternAnn?.pattern)
|
||||
}
|
||||
else ScriptTemplateDefinitionData(defAnn.resolver, defAnn.resolver.primaryConstructor?.call(), defAnn.scriptFilePattern)
|
||||
val obsoleteResolverAnn = template.annotations.firstIsInstanceOrNull<ScriptDependencyResolver>()
|
||||
val (resolverClass, resolverObject) =
|
||||
when {
|
||||
resolver != null -> resolver.javaClass.kotlin to resolver
|
||||
defAnn != null -> defAnn.resolver to defAnn.resolver.primaryConstructor?.call()
|
||||
obsoleteResolverAnn != null -> ObsoleteResolverProxy::class to ObsoleteResolverProxy(obsoleteResolverAnn)
|
||||
else -> BasicScriptDependenciesResolver::class to BasicScriptDependenciesResolver()
|
||||
}
|
||||
val filePattern = defAnn?.scriptFilePattern ?:
|
||||
template.annotations.firstIsInstanceOrNull<ScriptFilePattern>()?.pattern ?:
|
||||
DEFAULT_SCRIPT_FILE_PATTERN
|
||||
ScriptTemplateDefinitionData(resolverClass, resolverObject, filePattern)
|
||||
}
|
||||
|
||||
override val name = template.simpleName!!
|
||||
|
||||
+3
-1
@@ -32,6 +32,8 @@ interface ScriptTemplateProvider {
|
||||
|
||||
val templateClassName: String
|
||||
|
||||
val resolver: ScriptDependenciesResolverEx? get() = null
|
||||
|
||||
val dependenciesClasspath: Iterable<String>
|
||||
|
||||
val environment: Map<String, Any?>?
|
||||
@@ -56,7 +58,7 @@ fun makeScriptDefsFromTemplateProviders(providers: Iterable<ScriptTemplateProvid
|
||||
val loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader)
|
||||
val cl = loader.loadClass(provider.templateClassName)
|
||||
idToVersion.put(provider.id, provider.version)
|
||||
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.environment)
|
||||
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.environment)
|
||||
}
|
||||
catch (ex: Exception) {
|
||||
errorsHandler(provider, ex)
|
||||
|
||||
@@ -75,7 +75,7 @@ class ScriptTest2 {
|
||||
environment: Map<String, Any?>? = null,
|
||||
runIsolated: Boolean = true,
|
||||
suppressOutput: Boolean = false): Class<*>? =
|
||||
compileScriptImpl("compiler/testData/script/" + scriptPath, KotlinScriptDefinitionFromTemplate(scriptBase, environment), runIsolated, suppressOutput)
|
||||
compileScriptImpl("compiler/testData/script/" + scriptPath, KotlinScriptDefinitionFromTemplate(scriptBase, null, environment), runIsolated, suppressOutput)
|
||||
|
||||
private fun compileScriptImpl(
|
||||
scriptPath: String,
|
||||
|
||||
Reference in New Issue
Block a user