diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt index e2d60229c3f..f59e7b9d681 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt @@ -47,25 +47,24 @@ data class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, va private val evaluatedClasspath by lazy { config.classpath.evalWithVars(environmentVars).map { File(it) }.distinctBy { it.canonicalPath } } - override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): Future? = - makeNullableFakeFuture( - if (!isScript(file)) null - else { - val extDeps = getScriptDependenciesFromConfig(file) - when { - extDeps != null -> - object : KotlinScriptExternalDependencies { - override val classpath: Iterable = evaluatedClasspath + extDeps.classpath - override val imports = extDeps.imports - override val sources: Iterable = extDeps.sources - } - !evaluatedClasspath.isEmpty() -> - object : KotlinScriptExternalDependencies { - override val classpath: Iterable = evaluatedClasspath - } - else -> null - } - }) + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = + if (!isScript(file)) null + else { + val extDeps = getScriptDependenciesFromConfig(file) + when { + extDeps != null -> + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = evaluatedClasspath + extDeps.classpath + override val imports = extDeps.imports + override val sources: Iterable = extDeps.sources + } + !evaluatedClasspath.isEmpty() -> + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = evaluatedClasspath + } + else -> null + } + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index 2fe4c0b6030..568ed93588a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -54,10 +54,11 @@ interface KotlinScriptDefinition { fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) - fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): Future? = null + fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = null } interface KotlinScriptExternalDependencies { + val javaHome: String? get() = null val classpath: Iterable get() = emptyList() val imports: Iterable get() = emptyList() val sources: Iterable get() = emptyList() @@ -65,6 +66,7 @@ interface KotlinScriptExternalDependencies { } class KotlinScriptExternalDependenciesUnion(val dependencies: Iterable) : KotlinScriptExternalDependencies { + override val javaHome: String? get() = dependencies.firstOrNull { it.javaHome != null }?.javaHome override val classpath: Iterable get() = dependencies.flatMap { it.classpath } override val imports: Iterable get() = dependencies.flatMap { it.imports } override val sources: Iterable get() = dependencies.flatMap { it.sources } @@ -100,14 +102,3 @@ fun getKotlinTypeByFqName(scriptDescriptor: ScriptDescriptor, fqName: String): K ClassId.topLevel(FqName(fqName)), NotFoundClasses(LockBasedStorageManager.NO_LOCKS, scriptDescriptor.module) ).defaultType - -class FakeFuture(val value: T) : Future { - override fun isCancelled(): Boolean = false - override fun cancel(mayInterruptIfRunning: Boolean): Boolean = false - override fun get(): T = value - override fun get(timeout: Long, unit: TimeUnit): T = value - override fun isDone(): Boolean = true -} - -fun makeNullableFakeFuture(value: T?): Future? = - value?.let { FakeFuture(it) } ?: (null as Future?) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt index 8d2697ea199..b3999d3e193 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt @@ -37,7 +37,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri cache[path] ?: if (cacheOfNulls.contains(path)) null else scriptDefinitionProvider.findScriptDefinition(file) - ?.let { it.getDependenciesFor(file, project, null)?.get() } + ?.let { it.getDependenciesFor(file, project, null) } .apply { cacheLock.write { if (this == null) { cacheOfNulls.add(path) @@ -58,7 +58,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri if (!cache.containsKey(path) && !cacheOfNulls.contains(path) && !uncached.contains(path)) { val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) if (scriptDef != null) { - val deps = scriptDef.getDependenciesFor(file, project, null)?.get() + val deps = scriptDef.getDependenciesFor(file, project, null) if (deps != null) { cache.put(path, deps) } @@ -80,7 +80,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) if (scriptDef != null) { val oldDeps = cache[path] - val deps = scriptDef.getDependenciesFor(file, project, oldDeps)?.get() + val deps = scriptDef.getDependenciesFor(file, project, oldDeps) when { deps != null && (oldDeps == null || !deps.classpath.isSamePathListAs(oldDeps.classpath) || !deps.sources.isSamePathListAs(oldDeps.sources)) -> { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt index cf3f3d05516..e80b2ca2468 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt @@ -30,7 +30,6 @@ 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.io.InputStream import java.lang.reflect.InvocationHandler import java.lang.reflect.Method import java.lang.reflect.Proxy @@ -55,8 +54,7 @@ annotation class ScriptDependencyResolver(val resolver: KClass - val contents: CharSequence? - val contentsStream: InputStream? + val text: CharSequence? } // TODO: rename to just ScriptDependenciesResolver as soon as current deprecated one will be dropped @@ -64,7 +62,7 @@ interface ScriptDependenciesResolverEx { fun resolve(script: ScriptContents, environment: Map?, previousDependencies: KotlinScriptExternalDependencies? = null - ): Future? = null + ): KotlinScriptExternalDependencies? = null } @Deprecated("Use new ScriptDependenciesResolverEx") @@ -110,13 +108,13 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val override fun resolve(script: ScriptContents, environment: Map?, previousDependencies: KotlinScriptExternalDependencies? - ): Future? = makeNullableFakeFuture( + ): KotlinScriptExternalDependencies? = resolver?.resolve( environment?.get("projectRoot") as? File?, script.file, emptyList(), environment as Any? - )) + ) } private val definitionData by lazy { @@ -146,7 +144,7 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val // TODO: implement other strategy - e.g. try to extract something from match with ScriptFilePattern override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) - override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): Future? { + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? { val fileAnnotations = getAnnotationEntries(file, project) .map { KtAnnotationWrapper(it) } .mapNotNull { wrappedAnn -> @@ -196,8 +194,7 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val class BasicScriptContents(val myFile: TF, override val annotations: Iterable) : ScriptContents { override val file: File? get() = getFile(myFile) - override val contents: CharSequence? get() = getFileContents(myFile) - override val contentsStream: InputStream? get() = getFileContentsStream(myFile) + override val text: CharSequence? get() = getFileContents(myFile) } } diff --git a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt index 270291fd0d3..e9421e6f80a 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt @@ -32,11 +32,10 @@ abstract class BaseScriptDefinition (val extension: String, val cp: List? override val name = "Test Kotlin Script" override fun isScript(file: TF): Boolean = getFileName(file).endsWith(extension) override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, extension) - override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): Future? = - makeNullableFakeFuture( - object : KotlinScriptExternalDependencies { - override val classpath: Iterable = cp ?: (classpathFromProperty() + classpathFromClassloader(BaseScriptDefinition::class.java.classLoader)).distinct() - }) + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = + object : KotlinScriptExternalDependencies { + override val classpath: Iterable = cp ?: (classpathFromProperty() + classpathFromClassloader(BaseScriptDefinition::class.java.classLoader)).distinct() + } } open class SimpleParamsWithClasspathTestScriptDefinition(extension: String, val parameters: List, classpath: List? = null, val extraDependencies: KotlinScriptExternalDependencies? = null) diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt index 2f08bb0b04c..22e72b4a228 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt @@ -127,7 +127,7 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx { override fun resolve(script: ScriptContents, environment: Map?, previousDependencies: KotlinScriptExternalDependencies? - ): Future? + ): KotlinScriptExternalDependencies? { val cp = script.annotations.flatMap { when (it) { @@ -136,10 +136,10 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolverEx { else -> throw Exception("Unknown annotation ${it.javaClass}") } } - return makeNullableFakeFuture(object : KotlinScriptExternalDependencies { + return object : KotlinScriptExternalDependencies { override val classpath: Iterable = classpathFromClassloader() + cp override val imports: Iterable = listOf("org.jetbrains.kotlin.scripts.DependsOn") - }) + } } private fun classpathFromClassloader(): List =