Skip to content

Commit 4f3b68f

Browse files
committed
Avoid caching state in ScriptModuleInfos
This led to caching stale dependencies #KT-17770 Fixed
1 parent 152c8b5 commit 4f3b68f

File tree

3 files changed

+14
-17
lines changed

3 files changed

+14
-17
lines changed

idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
8080
private val facadesForScriptDependencies: SLRUCache<ScriptModuleInfo, ProjectResolutionFacade> =
8181
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(2, 3) {
8282
override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade {
83-
val dependencies = scriptModuleInfo?.externalDependencies
84-
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, dependencies, scriptModuleInfo))
83+
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, scriptModuleInfo))
8584
}
8685
}
8786

@@ -93,7 +92,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
9392
dependenciesModuleInfo: ScriptDependenciesModuleInfo,
9493
syntheticFiles: Collection<KtFile> = listOf()
9594
): ProjectResolutionFacade {
96-
val sdk = findJdk(dependenciesModuleInfo.dependencies, project)
95+
val sdk = findJdk(dependenciesModuleInfo.scriptModuleInfo?.externalDependencies, project)
9796
val platform = JvmPlatform // TODO: Js scripts?
9897
val facadeKey = PlatformAnalysisSettings(platform, sdk, true)
9998
val sdkFacade = GlobalFacade(facadeKey).facadeForSdk

idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ScriptModuleInfos.kt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,16 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
4141
override val moduleOrigin: ModuleOrigin
4242
get() = ModuleOrigin.OTHER
4343

44-
val externalDependencies by lazy {
45-
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
46-
}
44+
val externalDependencies: KotlinScriptExternalDependencies?
45+
get() = KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
4746

4847
override val name: Name = Name.special("<script ${scriptFile.name} ${scriptDefinition.name}>")
4948

5049
override fun contentScope() = GlobalSearchScope.fileScope(project, scriptFile)
5150

5251
override fun dependencies(): List<IdeaModuleInfo> {
5352
return listOf(
54-
this,
55-
ScriptDependenciesModuleInfo(project, externalDependencies, this)
53+
this, ScriptDependenciesModuleInfo(project, this)
5654
) + sdkDependencies(externalDependencies, project)
5755
}
5856
}
@@ -72,26 +70,26 @@ fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project):
7270

7371
class ScriptDependenciesModuleInfo(
7472
val project: Project,
75-
val dependencies: KotlinScriptExternalDependencies?,
7673
val scriptModuleInfo: ScriptModuleInfo?
77-
): IdeaModuleInfo, BinaryModuleInfo {
78-
override fun dependencies() = (listOf(this) + sdkDependencies(dependencies, project))
74+
) : IdeaModuleInfo, BinaryModuleInfo {
75+
override fun dependencies() = (listOf(this) + sdkDependencies(scriptModuleInfo?.externalDependencies, project))
7976

8077
override val name = Name.special("<Script dependencies>")
8178

8279
override fun contentScope(): GlobalSearchScope {
83-
if (dependencies == null) {
80+
if (scriptModuleInfo == null) {
8481
// we do not know which scripts these dependencies are
8582
return KotlinSourceFilterScope.libraryClassFiles(
8683
KotlinScriptConfigurationManager.getInstance(project).getAllScriptsClasspathScope(), project
8784
)
8885
}
89-
val classpath = KotlinScriptConfigurationManager.toVfsRoots(dependencies.classpath)
86+
val roots = scriptModuleInfo.externalDependencies?.classpath ?: emptyList()
87+
val classpath = KotlinScriptConfigurationManager.toVfsRoots(roots)
9088
// TODO: this is not very efficient because KotlinSourceFilterScope already checks if the files are in scripts classpath
9189
return KotlinSourceFilterScope.libraryClassFiles(NonClasspathDirectoriesScope(classpath), project)
9290
}
9391

94-
// NOTE: intentionally not taking dependencies into account
92+
// NOTE: intentionally not taking corresponding script info into account
9593
// otherwise there is no way to implement getModuleInfo
9694
override fun hashCode() = project.hashCode()
9795
override fun equals(other: Any?): Boolean = other is ScriptDependenciesModuleInfo && this.project == other.project
@@ -105,11 +103,11 @@ class ScriptDependenciesModuleInfo(
105103

106104
data class ScriptDependenciesSourceModuleInfo(
107105
val project: Project
108-
): IdeaModuleInfo, SourceForBinaryModuleInfo {
106+
) : IdeaModuleInfo, SourceForBinaryModuleInfo {
109107
override val name = Name.special("<Source for script dependencies>")
110108

111109
override val binariesModuleInfo: ScriptDependenciesModuleInfo
112-
get() = ScriptDependenciesModuleInfo(project, null, null)
110+
get() = ScriptDependenciesModuleInfo(project, null)
113111

114112
override fun sourceScope(): GlobalSearchScope = KotlinSourceFilterScope.librarySources(
115113
KotlinScriptConfigurationManager.getInstance(project).getAllLibrarySourcesScope(), project

idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/getModuleInfo.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil
142142
return ScriptDependenciesSourceModuleInfo(project)
143143
}
144144
else {
145-
return ScriptDependenciesModuleInfo(project, null, null)
145+
return ScriptDependenciesModuleInfo(project, null)
146146
}
147147
}
148148
if (!isBinary && virtualFile in scriptConfigurationManager.getAllLibrarySourcesScope()) {

0 commit comments

Comments
 (0)