From 693eeb9f0ade1f303bbaff49f5b717c5e7f4988c Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Thu, 16 Jun 2016 19:29:20 +0300 Subject: [PATCH] Split ScriptModuleInfo into script itself and its dependencies For now include all dependencies of all scripts for every script, to be improved later --- .../idea/caches/resolve/IdeaModuleInfos.kt | 54 +++++++------------ .../caches/resolve/KotlinCacheServiceImpl.kt | 8 ++- .../caches/resolve/ModuleDependencyMapper.kt | 4 +- .../idea/caches/resolve/getModuleInfo.kt | 10 +++- .../kotlin/idea/caches/resolve/scopeUtils.kt | 2 +- 5 files changed, 34 insertions(+), 44 deletions(-) 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 71e6da859f3..66d87eab4b0 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 @@ -23,7 +23,6 @@ import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.* import com.intellij.openapi.roots.impl.libraries.LibraryEx import com.intellij.openapi.roots.libraries.Library -import com.intellij.openapi.vfs.StandardFileSystems import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.DelegatingGlobalSearchScope @@ -31,14 +30,14 @@ import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager import com.intellij.util.SmartList -import com.intellij.util.io.URLUtil import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.idea.core.script.KotlinScriptConfigurationManager +import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.script.KotlinScriptDefinition import org.jetbrains.kotlin.utils.alwaysNull import org.jetbrains.kotlin.utils.emptyOrSingletonList -import java.io.File import java.lang.reflect.Method import java.util.* @@ -81,6 +80,8 @@ interface IdeaModuleInfo : ModuleInfo { override val capabilities: Map, Any?> get() = mapOf(OriginCapability to moduleOrigin) + + override fun dependencies(): List } private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, productionOnly: Boolean): List { @@ -291,44 +292,29 @@ class ScriptModuleSearchScope(val scriptFile: VirtualFile, baseScope: GlobalSear override fun hashCode() = scriptFile.hashCode() * 73 * super.hashCode() } -internal data class ScriptModuleInfo(val project: Project, val module: Module?, val scriptFile: VirtualFile, - val scriptDefinition: KotlinScriptDefinition) : IdeaModuleInfo { +data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile, + val scriptDefinition: KotlinScriptDefinition) : IdeaModuleInfo { override val moduleOrigin: ModuleOrigin get() = ModuleOrigin.OTHER override val name: Name = Name.special("<$SCRIPT_NAME_PREFIX${scriptDefinition.name}>") - override fun contentScope(): ScriptModuleSearchScope { - val dependenciesRoots = dependenciesRoots() - return ScriptModuleSearchScope( - scriptFile, - if (dependenciesRoots.isEmpty()) GlobalSearchScope.EMPTY_SCOPE - else GlobalSearchScope.union(dependenciesRoots.map { FileLibraryScope(project, it) }.toTypedArray())) - } + override fun contentScope() = GlobalSearchScope.fileScope(project, scriptFile) - 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, null)?.classpath - ?.map { it.canonicalFile } - ?.distinct() - ?.mapNotNull { - // TODO: ensure that the entries are checked elsewhere, so diagnostics is delivered to a user if files are not correctly specified - if (it.isFile) - jarfs.findFileByPath(it.absolutePath + URLUtil.JAR_SEPARATOR) ?: null // diag: Classpath entry points to a file that is not a JAR archive - else - StandardFileSystems.local().findFileByPath(it.absolutePath) ?: null // diag: Classpath entry points to a non-existent location - } - ?: emptyList() - } + // TODO: only dependencies of this particular script + override fun dependencies() = listOf(this, ScriptDependenciesModuleInfo(project)) +} - override fun dependencies() = - listOf(this) + - (module?.cached(CachedValueProvider { - CachedValueProvider.Result( - ideaModelDependencies(module, productionOnly = false), - ProjectRootModificationTracker.getInstance(module.project)) - }) ?: emptyList()) +data class ScriptDependenciesModuleInfo(val project: Project): IdeaModuleInfo { + override fun dependencies() = listOf(this) + + override val name = Name.special("