From 4f05f839a38153a8fba6b5578293d4ec67d918b9 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 17 Jun 2016 17:04:14 +0200 Subject: [PATCH] Add previous imports to resolving interfaces to enable effective caching implementations --- .../script/KotlinConfigurableScriptDefinition.kt | 2 +- .../jetbrains/kotlin/script/KotlinScriptDefinition.kt | 2 +- .../script/KotlinScriptExternalImportsProvider.kt | 6 +++--- .../src/org/jetbrains/kotlin/script/scriptTemplate.kt | 10 +++++++--- .../jetbrains/kotlin/scripts/TestScriptDefinitions.kt | 2 +- .../tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt | 7 ++++++- .../kotlin/idea/caches/resolve/IdeaModuleInfos.kt | 2 +- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt index 7ed6f6e53f4..00190d8347b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinConfigurableScriptDefinition.kt @@ -46,7 +46,7 @@ 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): KotlinScriptExternalDependencies? = + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = if (!isScript(file)) null else { val extDeps = getScriptDependenciesFromConfig(file) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index 8f052a9fa0e..8461969256a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -54,7 +54,7 @@ interface KotlinScriptDefinition { fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) - fun getDependenciesFor(file: TF, project: Project): KotlinScriptExternalDependencies? = null + fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = null } interface KotlinScriptExternalDependencies { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt index 6ac2ef260fc..2f5b8ce5ae3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt @@ -36,7 +36,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) } + ?.let { it.getDependenciesFor(file, project, null) } .apply { cacheLock.write { if (this == null) { cacheOfNulls.add(path) @@ -57,7 +57,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) + val deps = scriptDef.getDependenciesFor(file, project, null) if (deps != null) { cache.put(path, deps) } @@ -78,8 +78,8 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri val path = getFilePath(file) val scriptDef = scriptDefinitionProvider.findScriptDefinition(file) if (scriptDef != null) { - val deps = scriptDef.getDependenciesFor(file, project) val oldDeps = cache[path] + val deps = scriptDef.getDependenciesFor(file, project, oldDeps) when { deps != null && (oldDeps == null || !deps.classpath.isSameClasspathAs(oldDeps.classpath) || !deps.sources.isSameClasspathAs(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 8bf52e3b87d..7d19d1681cf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptTemplate.kt @@ -41,7 +41,11 @@ import kotlin.reflect.memberProperties annotation class ScriptFilePattern(val pattern: String) interface ScriptDependenciesResolver { - fun resolve(scriptFile: File?, annotations: Iterable, environment: Map?): KotlinScriptExternalDependencies? = null + fun resolve(scriptFile: File?, + annotations: Iterable, + environment: Map?, + previousDependencies: KotlinScriptExternalDependencies? = null + ): KotlinScriptExternalDependencies? = null } @Target(AnnotationTarget.CLASS) @@ -88,7 +92,7 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val return res } - override fun getDependenciesFor(file: TF, project: Project): KotlinScriptExternalDependencies? { + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? { val fileAnnotations = getAnnotationEntries(file, project) .map { KtAnnotationWrapper(it) } .mapNotNull { wrappedAnn -> @@ -111,7 +115,7 @@ data class KotlinScriptDefinitionFromTemplate(val template: KClass, val val annFQN = ann.first.qualifiedName if (resolver.first.supportedAnnotationClasses.asIterable2().any { it.qualifiedName == annFQN }) ann.second else null } - resolver.second.resolve(getFile(file), supportedAnnotations, environment) + resolver.second.resolve(getFile(file), supportedAnnotations, environment, previousDependencies) } return KotlinScriptExternalDependenciesUnion(fileDeps) } diff --git a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt index 1d131992b49..7d58a6399f4 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt @@ -31,7 +31,7 @@ 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): KotlinScriptExternalDependencies? = + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = object : KotlinScriptExternalDependencies { override val classpath: Iterable = cp ?: (classpathFromProperty() + classpathFromClassloader(BaseScriptDefinition::class.java.classLoader)).distinct() } diff --git a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt index 6302eaab763..f4aebad76a5 100644 --- a/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt +++ b/compiler/tests/org/jetbrains/kotlin/scripts/ScriptTest2.kt @@ -120,7 +120,12 @@ class TestKotlinScriptDependenciesResolver : ScriptDependenciesResolver { private val kotlinPaths by lazy { PathUtil.getKotlinPathsForCompiler() } - override fun resolve(scriptFile: File?, annotations: Iterable, environment: Map?): KotlinScriptExternalDependencies? { + override fun resolve(scriptFile: File?, + annotations: Iterable, + environment: Map?, + previousDependencies: KotlinScriptExternalDependencies? + ): KotlinScriptExternalDependencies? + { val cp = annotations.flatMap { when (it) { is depends -> listOf(if (it.path == "@{runtime}") kotlinPaths.runtimePath else File(it.path)) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt index 8cab812c7f7..71e6da859f3 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt @@ -309,7 +309,7 @@ internal data class ScriptModuleInfo(val project: Project, val module: Module?, private fun dependenciesRoots(): List { // TODO: find out whether it should be cashed (some changes listener should be implemented for the cached roots) val jarfs = StandardFileSystems.jar() - return scriptDefinition.getDependenciesFor(scriptFile, project)?.classpath + return scriptDefinition.getDependenciesFor(scriptFile, project, null)?.classpath ?.map { it.canonicalFile } ?.distinct() ?.mapNotNull {