Avoid caching state in ScriptModuleInfos
This led to caching stale dependencies #KT-17770 Fixed
This commit is contained in:
+2
-3
@@ -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
|
||||
|
||||
+11
-13
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user