From 5900cad8b3ebc23bc41698a1f86768fc875edf98 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 14 Jul 2016 11:30:53 +0200 Subject: [PATCH] Add possibility to pass script dependency resolver directly rather than via definition annotation This may help to reduce dependencies in certain situations --- .../jetbrains/kotlin/script/scriptTemplate.kt | 27 +++++++++++++------ .../scriptTemplateProviderExtensionPoint.kt | 4 ++- .../jetbrains/kotlin/scripts/ScriptTest2.kt | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt index e80b2ca2468..5b44d46e9e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt @@ -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 = 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) -data class KotlinScriptDefinitionFromTemplate(val template: KClass, val environment: Map?) : KotlinScriptDefinition { +data class KotlinScriptDefinitionFromTemplate(val template: KClass, + val resolver: ScriptDependenciesResolverEx? = null, + val environment: Map? = null +) : KotlinScriptDefinition { // TODO: remove this and simplify definitionAnnotation as soon as deprecated annotations will be removed internal class ScriptTemplateDefinitionData(val resolverClass: KClass, @@ -119,12 +124,18 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val private val definitionData by lazy { val defAnn = template.annotations.firstIsInstanceOrNull() - if (defAnn == null) { - val resolverAnn = template.annotations.firstIsInstanceOrNull() - val filePatternAnn = template.annotations.firstIsInstanceOrNull() - ScriptTemplateDefinitionData(ObsoleteResolverProxy::class, ObsoleteResolverProxy(resolverAnn), filePatternAnn?.pattern) - } - else ScriptTemplateDefinitionData(defAnn.resolver, defAnn.resolver.primaryConstructor?.call(), defAnn.scriptFilePattern) + val obsoleteResolverAnn = template.annotations.firstIsInstanceOrNull() + 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()?.pattern ?: + DEFAULT_SCRIPT_FILE_PATTERN + ScriptTemplateDefinitionData(resolverClass, resolverObject, filePattern) } override val name = template.simpleName!! diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt index f9455203495..6fd5eb3f8e4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplateProviderExtensionPoint.kt @@ -32,6 +32,8 @@ interface ScriptTemplateProvider { val templateClassName: String + val resolver: ScriptDependenciesResolverEx? get() = null + val dependenciesClasspath: Iterable val environment: Map? @@ -56,7 +58,7 @@ fun makeScriptDefsFromTemplateProviders(providers: Iterable? = 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,