[LL] LLFirAbstractSessionFactory: Fix eager loading of anchor module sessions

- `LLFirAbstractSessionFactory` should not load other sessions eagerly
  because session creation occurs inside a `computeIfAbsent`, which does
  not allow recursive updates to the session cache.
- The issue has not surfaced so far because the default implementation
  of `computeIfAbsent` is not sensitive to recursive updates.

^KT-65418 fixed
This commit is contained in:
Marco Pennekamp
2024-01-30 20:43:55 +01:00
committed by Space Team
parent e4a8fc01c3
commit 64ad40e863
@@ -344,10 +344,6 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
val scopeProvider = FirKotlinScopeProvider()
val components = LLFirModuleResolveComponents(module, globalResolveComponents, scopeProvider)
val moduleAnchorSession = KotlinAnchorModuleProvider.getInstance(project)?.getAnchorModule(libraryModule)?.let {
LLFirSessionCache.getInstance(project).getSession(it)
}
val session = LLFirLibraryOrLibrarySourceResolvableModuleSession(module, components, builtinsSession.builtinTypes)
components.session = session
@@ -399,11 +395,12 @@ internal abstract class LLFirAbstractSessionFactory(protected val project: Proje
addAll(restLibrariesProvider)
moduleAnchorSession?.let {
(it.symbolProvider as LLFirModuleWithDependenciesSymbolProvider).also { moduleSymbolProvider ->
addAll(moduleSymbolProvider.providers)
addAll(moduleSymbolProvider.dependencyProvider.providers)
}
KotlinAnchorModuleProvider.getInstance(project)?.getAnchorModule(libraryModule)?.let { anchorModule ->
val anchorModuleSession = LLFirSessionCache.getInstance(project).getSession(anchorModule)
val anchorModuleSymbolProvider = anchorModuleSession.symbolProvider as LLFirModuleWithDependenciesSymbolProvider
addAll(anchorModuleSymbolProvider.providers)
addAll(anchorModuleSymbolProvider.dependencyProvider.providers)
}
}
}