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> =
|
private val facadesForScriptDependencies: SLRUCache<ScriptModuleInfo, ProjectResolutionFacade> =
|
||||||
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(2, 3) {
|
object : SLRUCache<ScriptModuleInfo, ProjectResolutionFacade>(2, 3) {
|
||||||
override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade {
|
override fun createValue(scriptModuleInfo: ScriptModuleInfo?): ProjectResolutionFacade {
|
||||||
val dependencies = scriptModuleInfo?.externalDependencies
|
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, scriptModuleInfo))
|
||||||
return createFacadeForScriptDependencies(ScriptDependenciesModuleInfo(project, dependencies, scriptModuleInfo))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +92,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
dependenciesModuleInfo: ScriptDependenciesModuleInfo,
|
dependenciesModuleInfo: ScriptDependenciesModuleInfo,
|
||||||
syntheticFiles: Collection<KtFile> = listOf()
|
syntheticFiles: Collection<KtFile> = listOf()
|
||||||
): ProjectResolutionFacade {
|
): ProjectResolutionFacade {
|
||||||
val sdk = findJdk(dependenciesModuleInfo.dependencies, project)
|
val sdk = findJdk(dependenciesModuleInfo.scriptModuleInfo?.externalDependencies, project)
|
||||||
val platform = JvmPlatform // TODO: Js scripts?
|
val platform = JvmPlatform // TODO: Js scripts?
|
||||||
val facadeKey = PlatformAnalysisSettings(platform, sdk, true)
|
val facadeKey = PlatformAnalysisSettings(platform, sdk, true)
|
||||||
val sdkFacade = GlobalFacade(facadeKey).facadeForSdk
|
val sdkFacade = GlobalFacade(facadeKey).facadeForSdk
|
||||||
|
|||||||
+11
-13
@@ -41,9 +41,8 @@ data class ScriptModuleInfo(val project: Project, val scriptFile: VirtualFile,
|
|||||||
override val moduleOrigin: ModuleOrigin
|
override val moduleOrigin: ModuleOrigin
|
||||||
get() = ModuleOrigin.OTHER
|
get() = ModuleOrigin.OTHER
|
||||||
|
|
||||||
val externalDependencies by lazy {
|
val externalDependencies: KotlinScriptExternalDependencies?
|
||||||
KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
|
get() = KotlinScriptExternalImportsProvider.getInstance(project)?.getExternalImports(scriptFile)
|
||||||
}
|
|
||||||
|
|
||||||
override val name: Name = Name.special("<script ${scriptFile.name} ${scriptDefinition.name}>")
|
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> {
|
override fun dependencies(): List<IdeaModuleInfo> {
|
||||||
return listOf(
|
return listOf(
|
||||||
this,
|
this, ScriptDependenciesModuleInfo(project, this)
|
||||||
ScriptDependenciesModuleInfo(project, externalDependencies, this)
|
|
||||||
) + sdkDependencies(externalDependencies, project)
|
) + sdkDependencies(externalDependencies, project)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -72,26 +70,26 @@ fun findJdk(dependencies: KotlinScriptExternalDependencies?, project: Project):
|
|||||||
|
|
||||||
class ScriptDependenciesModuleInfo(
|
class ScriptDependenciesModuleInfo(
|
||||||
val project: Project,
|
val project: Project,
|
||||||
val dependencies: KotlinScriptExternalDependencies?,
|
|
||||||
val scriptModuleInfo: ScriptModuleInfo?
|
val scriptModuleInfo: ScriptModuleInfo?
|
||||||
): IdeaModuleInfo, BinaryModuleInfo {
|
) : IdeaModuleInfo, BinaryModuleInfo {
|
||||||
override fun dependencies() = (listOf(this) + sdkDependencies(dependencies, project))
|
override fun dependencies() = (listOf(this) + sdkDependencies(scriptModuleInfo?.externalDependencies, project))
|
||||||
|
|
||||||
override val name = Name.special("<Script dependencies>")
|
override val name = Name.special("<Script dependencies>")
|
||||||
|
|
||||||
override fun contentScope(): GlobalSearchScope {
|
override fun contentScope(): GlobalSearchScope {
|
||||||
if (dependencies == null) {
|
if (scriptModuleInfo == null) {
|
||||||
// we do not know which scripts these dependencies are
|
// we do not know which scripts these dependencies are
|
||||||
return KotlinSourceFilterScope.libraryClassFiles(
|
return KotlinSourceFilterScope.libraryClassFiles(
|
||||||
KotlinScriptConfigurationManager.getInstance(project).getAllScriptsClasspathScope(), project
|
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
|
// TODO: this is not very efficient because KotlinSourceFilterScope already checks if the files are in scripts classpath
|
||||||
return KotlinSourceFilterScope.libraryClassFiles(NonClasspathDirectoriesScope(classpath), project)
|
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
|
// otherwise there is no way to implement getModuleInfo
|
||||||
override fun hashCode() = project.hashCode()
|
override fun hashCode() = project.hashCode()
|
||||||
override fun equals(other: Any?): Boolean = other is ScriptDependenciesModuleInfo && this.project == other.project
|
override fun equals(other: Any?): Boolean = other is ScriptDependenciesModuleInfo && this.project == other.project
|
||||||
@@ -105,11 +103,11 @@ class ScriptDependenciesModuleInfo(
|
|||||||
|
|
||||||
data class ScriptDependenciesSourceModuleInfo(
|
data class ScriptDependenciesSourceModuleInfo(
|
||||||
val project: Project
|
val project: Project
|
||||||
): IdeaModuleInfo, SourceForBinaryModuleInfo {
|
) : IdeaModuleInfo, SourceForBinaryModuleInfo {
|
||||||
override val name = Name.special("<Source for script dependencies>")
|
override val name = Name.special("<Source for script dependencies>")
|
||||||
|
|
||||||
override val binariesModuleInfo: ScriptDependenciesModuleInfo
|
override val binariesModuleInfo: ScriptDependenciesModuleInfo
|
||||||
get() = ScriptDependenciesModuleInfo(project, null, null)
|
get() = ScriptDependenciesModuleInfo(project, null)
|
||||||
|
|
||||||
override fun sourceScope(): GlobalSearchScope = KotlinSourceFilterScope.librarySources(
|
override fun sourceScope(): GlobalSearchScope = KotlinSourceFilterScope.librarySources(
|
||||||
KotlinScriptConfigurationManager.getInstance(project).getAllLibrarySourcesScope(), project
|
KotlinScriptConfigurationManager.getInstance(project).getAllLibrarySourcesScope(), project
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ private fun getModuleInfoByVirtualFile(project: Project, virtualFile: VirtualFil
|
|||||||
return ScriptDependenciesSourceModuleInfo(project)
|
return ScriptDependenciesSourceModuleInfo(project)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return ScriptDependenciesModuleInfo(project, null, null)
|
return ScriptDependenciesModuleInfo(project, null)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!isBinary && virtualFile in scriptConfigurationManager.getAllLibrarySourcesScope()) {
|
if (!isBinary && virtualFile in scriptConfigurationManager.getAllLibrarySourcesScope()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user