Avoid caching state in ScriptModuleInfos

This led to caching stale dependencies

 #KT-17770 Fixed
This commit is contained in:
Pavel V. Talanov
2017-05-17 17:55:41 +03:00
parent 152c8b521e
commit 4f3b68f8e9
3 changed files with 14 additions and 17 deletions
@@ -80,8 +80,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
private val facadesForScriptDependencies: SLRUCache<ScriptModuleInfo, ProjectResolutionFacade> =
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(2, 3) {
override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade {
val dependencies = scriptModuleInfo?.externalDependencies
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, dependencies, scriptModuleInfo))
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, scriptModuleInfo))
}
}
@@ -93,7 +92,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
dependenciesModuleInfo: ScriptDependenciesModuleInfo,
syntheticFiles: Collection<KtFile> = listOf()
): ProjectResolutionFacade {
val sdk = findJdk(dependenciesModuleInfo.dependencies, project)
val sdk = findJdk(dependenciesModuleInfo.scriptModuleInfo?.externalDependencies, project)
val platform = JvmPlatform // TODO: Js scripts?
val facadeKey = PlatformAnalysisSettings(platform, sdk, true)
val sdkFacade = GlobalFacade(facadeKey).facadeForSdk
@@ -41,9 +41,8 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
override val moduleOrigin: ModuleOrigin
get() = ModuleOrigin.OTHER
val externalDependencies by lazy {
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
}
val externalDependencies: KotlinScriptExternalDependencies?
get() = KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
override val name: Name = Name.special("<script ${scriptFile.name} ${scriptDefinition.name}>")
@@ -51,8 +50,7 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
override fun dependencies(): List<IdeaModuleInfo> {
return listOf(
this,
ScriptDependenciesModuleInfo(project, externalDependencies, this)
this, ScriptDependenciesModuleInfo(project, this)
) + sdkDependencies(externalDependencies, project)
}
}
@@ -72,26 +70,26 @@ fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project):
class ScriptDependenciesModuleInfo(
val project: Project,
val dependencies: KotlinScriptExternalDependencies?,
val scriptModuleInfo: ScriptModuleInfo?
): IdeaModuleInfo, BinaryModuleInfo {
override fun dependencies() = (listOf(this) + sdkDependencies(dependencies, project))
) : IdeaModuleInfo, BinaryModuleInfo {
override fun dependencies() = (listOf(this) + sdkDependencies(scriptModuleInfo?.externalDependencies, project))
override val name = Name.special("<Script dependencies>")
override fun contentScope(): GlobalSearchScope {
if (dependencies == null) {
if (scriptModuleInfo == null) {
// we do not know which scripts these dependencies are
return KotlinSourceFilterScope.libraryClassFiles(
KotlinScriptConfigurationManager.getInstance(project).getAllScriptsClasspathScope(), project
)
}
val classpath = KotlinScriptConfigurationManager.toVfsRoots(dependencies.classpath)
val roots = scriptModuleInfo.externalDependencies?.classpath ?: emptyList()
val classpath = KotlinScriptConfigurationManager.toVfsRoots(roots)
// TODO: this is not very efficient because KotlinSourceFilterScope already checks if the files are in scripts classpath
return KotlinSourceFilterScope.libraryClassFiles(NonClasspathDirectoriesScope(classpath), project)
}
// NOTE: intentionally not taking dependencies into account
// NOTE: intentionally not taking corresponding script info into account
// otherwise there is no way to implement getModuleInfo
override fun hashCode() = project.hashCode()
override fun equals(other: Any?): Boolean = other is ScriptDependenciesModuleInfo && this.project == other.project
@@ -105,11 +103,11 @@ class ScriptDependenciesModuleInfo(
data class ScriptDependenciesSourceModuleInfo(
val project: Project
): IdeaModuleInfo, SourceForBinaryModuleInfo {
) : IdeaModuleInfo, SourceForBinaryModuleInfo {
override val name = Name.special("<Source for script dependencies>")
override val binariesModuleInfo: ScriptDependenciesModuleInfo
get() = ScriptDependenciesModuleInfo(project, null, null)
get() = ScriptDependenciesModuleInfo(project, null)
override fun sourceScope(): GlobalSearchScope = KotlinSourceFilterScope.librarySources(
KotlinScriptConfigurationManager.getInstance(project).getAllLibrarySourcesScope(), project
@@ -142,7 +142,7 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil
return ScriptDependenciesSourceModuleInfo(project)
}
else {
return ScriptDependenciesModuleInfo(project, null, null)
return ScriptDependenciesModuleInfo(project, null)
}
}
if (!isBinary && virtualFile in scriptConfigurationManager.getAllLibrarySourcesScope()) {