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:
Ilya Chernikov
2016-07-14 11:30:53 +02:00
parent 5fb79259f7
commit 5900cad8b3
3 changed files with 23 additions and 10 deletions
@@ -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!!
@@ -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,