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 java.util.concurrent.Future
|
||||||
import kotlin.reflect.*
|
import kotlin.reflect.*
|
||||||
|
|
||||||
|
const val DEFAULT_SCRIPT_FILE_PATTERN = "*.\\.kts"
|
||||||
|
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
annotation class ScriptTemplateDefinition(val resolver: KClass<out ScriptDependenciesResolverEx> = BasicScriptDependenciesResolver::class,
|
annotation class ScriptTemplateDefinition(val resolver: KClass<out ScriptDependenciesResolverEx> = BasicScriptDependenciesResolver::class,
|
||||||
val scriptFilePattern: String = "*.\\.kts")
|
val scriptFilePattern: String = DEFAULT_SCRIPT_FILE_PATTERN)
|
||||||
|
|
||||||
@Deprecated("Use ScriptTemplateDefinition")
|
@Deprecated("Use ScriptTemplateDefinition")
|
||||||
@Target(AnnotationTarget.CLASS)
|
@Target(AnnotationTarget.CLASS)
|
||||||
@@ -80,7 +82,10 @@ class BasicScriptDependenciesResolver : ScriptDependenciesResolverEx
|
|||||||
@Retention(AnnotationRetention.RUNTIME)
|
@Retention(AnnotationRetention.RUNTIME)
|
||||||
annotation class AcceptedAnnotations(vararg val supportedAnnotationClasses: KClass<out Annotation>)
|
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
|
// TODO: remove this and simplify definitionAnnotation as soon as deprecated annotations will be removed
|
||||||
internal class ScriptTemplateDefinitionData(val resolverClass: KClass<out ScriptDependenciesResolverEx>,
|
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 {
|
private val definitionData by lazy {
|
||||||
val defAnn = template.annotations.firstIsInstanceOrNull<ScriptTemplateDefinition>()
|
val defAnn = template.annotations.firstIsInstanceOrNull<ScriptTemplateDefinition>()
|
||||||
if (defAnn == null) {
|
val obsoleteResolverAnn = template.annotations.firstIsInstanceOrNull<ScriptDependencyResolver>()
|
||||||
val resolverAnn = template.annotations.firstIsInstanceOrNull<ScriptDependencyResolver>()
|
val (resolverClass, resolverObject) =
|
||||||
val filePatternAnn = template.annotations.firstIsInstanceOrNull<ScriptFilePattern>()
|
when {
|
||||||
ScriptTemplateDefinitionData(ObsoleteResolverProxy::class, ObsoleteResolverProxy(resolverAnn), filePatternAnn?.pattern)
|
resolver != null -> resolver.javaClass.kotlin to resolver
|
||||||
}
|
defAnn != null -> defAnn.resolver to defAnn.resolver.primaryConstructor?.call()
|
||||||
else ScriptTemplateDefinitionData(defAnn.resolver, defAnn.resolver.primaryConstructor?.call(), defAnn.scriptFilePattern)
|
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!!
|
override val name = template.simpleName!!
|
||||||
|
|||||||
+3
-1
@@ -32,6 +32,8 @@ interface ScriptTemplateProvider {
|
|||||||
|
|
||||||
val templateClassName: String
|
val templateClassName: String
|
||||||
|
|
||||||
|
val resolver: ScriptDependenciesResolverEx? get() = null
|
||||||
|
|
||||||
val dependenciesClasspath: Iterable<String>
|
val dependenciesClasspath: Iterable<String>
|
||||||
|
|
||||||
val environment: Map<String, Any?>?
|
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 loader = URLClassLoader(provider.dependenciesClasspath.map { File(it).toURI().toURL() }.toTypedArray(), ScriptTemplateProvider::class.java.classLoader)
|
||||||
val cl = loader.loadClass(provider.templateClassName)
|
val cl = loader.loadClass(provider.templateClassName)
|
||||||
idToVersion.put(provider.id, provider.version)
|
idToVersion.put(provider.id, provider.version)
|
||||||
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.environment)
|
KotlinScriptDefinitionFromTemplate(cl.kotlin, provider.resolver, provider.environment)
|
||||||
}
|
}
|
||||||
catch (ex: Exception) {
|
catch (ex: Exception) {
|
||||||
errorsHandler(provider, ex)
|
errorsHandler(provider, ex)
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class ScriptTest2 {
|
|||||||
environment: Map<String, Any?>? = null,
|
environment: Map<String, Any?>? = null,
|
||||||
runIsolated: Boolean = true,
|
runIsolated: Boolean = true,
|
||||||
suppressOutput: Boolean = false): Class<*>? =
|
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(
|
private fun compileScriptImpl(
|
||||||
scriptPath: String,
|
scriptPath: String,
|
||||||
|
|||||||
Reference in New Issue
Block a user