From 3b1e7494b88cc2a0fe53fc29afcfaab610f5c99c Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 28 Jul 2016 15:06:31 +0200 Subject: [PATCH] Change dependencies resolver API - it gets message reporter and returns Future now --- .../jetbrains/kotlin/script/scriptTemplate.kt | 34 ++++++++++++++++--- .../jetbrains/kotlin/scripts/ScriptTest2.kt | 5 +-- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt index 1c173e7d4d1..2b6be6a6e65 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt @@ -30,6 +30,8 @@ import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.io.File +import java.util.concurrent.Future +import java.util.concurrent.TimeUnit import kotlin.reflect.* const val DEFAULT_SCRIPT_FILE_PATTERN = "*.\\.kts" @@ -50,17 +52,34 @@ annotation class ScriptFilePattern(val pattern: String) annotation class ScriptDependencyResolver(val resolver: KClass) interface ScriptContents { + + data class Position(val line: Int, val col: Int) + val file: File? val annotations: Iterable val text: CharSequence? } +class PseudoFuture(private val value: T): Future { + override fun get(): T = value + override fun get(p0: Long, p1: TimeUnit): T = value + override fun cancel(p0: Boolean): Boolean = false + override fun isDone(): Boolean = true + override fun isCancelled(): Boolean = false +} + +fun KotlinScriptExternalDependencies?.asFuture(): PseudoFuture = PseudoFuture(this) + // TODO: rename to just ScriptDependenciesResolver as soon as current deprecated one will be dropped interface ScriptDependenciesResolverEx { + + enum class ReportSeverity { ERROR, WARNING, INFO, DEBUG } + fun resolve(script: ScriptContents, environment: Map?, - previousDependencies: KotlinScriptExternalDependencies? = null - ): KotlinScriptExternalDependencies? = null + report: (ReportSeverity, String, ScriptContents.Position?) -> Unit, + previousDependencies: KotlinScriptExternalDependencies? + ): Future = PseudoFuture(null) } @Deprecated("Use new ScriptDependenciesResolverEx") @@ -108,14 +127,16 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, private val resolver by lazy { resolverAnn?.resolver?.primaryConstructor?.call() } override fun resolve(script: ScriptContents, environment: Map?, + report: (ScriptDependenciesResolverEx.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? - ): KotlinScriptExternalDependencies? = + ): Future = resolver?.resolve( environment?.get("projectRoot") as? File?, script.file, emptyList(), environment as Any? ) + .asFuture() } private val definitionData by lazy { @@ -158,8 +179,11 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, psiAnn.typeName.let { it == ann.simpleName || it == ann.qualifiedName } }?.let { KtAnnotationWrapper(psiAnn, classLoader.loadClass(it.qualifiedName).kotlin as KClass) } } - val fileDeps = definitionData.resolver?.resolve(BasicScriptContents(file, annotationWrappers.map { it.getProxy(classLoader) }), environment, previousDependencies) - return fileDeps + val fileDeps = definitionData.resolver?.resolve(BasicScriptContents(file, annotationWrappers.map { it.getProxy(classLoader) }), + environment, + { reportSeverity: ScriptDependenciesResolverEx.ReportSeverity, s: String, position: ScriptContents.Position? -> }, + previousDependencies) + return fileDeps?.get() } private fun getAnnotationEntries(file: TF, project: Project): Iterable = when (file) { diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt index 1f8081dee9a..0de34b50d15 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt @@ -133,8 +133,9 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx { @AcceptedAnnotations(DependsOn::class, DependsOnTwo::class) override fun resolve(script: ScriptContents, environment: Map?, + report: (ScriptDependenciesResolverEx.ReportSeverity, String, ScriptContents.Position?) -> Unit, previousDependencies: KotlinScriptExternalDependencies? - ): KotlinScriptExternalDependencies? + ): Future { val cp = script.annotations.flatMap { when (it) { @@ -153,7 +154,7 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx { return object : KotlinScriptExternalDependencies { override val classpath: Iterable = classpathFromClassloader() + cp override val imports: Iterable = listOf("org.jetbrains.kotlin.scripts.DependsOn", "org.jetbrains.kotlin.scripts.DependsOnTwo") - } + }.asFuture() } private fun classpathFromClassloader(): List =