From 64ad40e8632660144f5f2830cff9645e365a3e35 Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 30 Jan 2024 20:43:55 +0100 Subject: [PATCH] [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 --- .../fir/sessions/LLFirAbstractSessionFactory.kt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt index ba3ef5c5fc4..6917e6e67fb 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirAbstractSessionFactory.kt @@ -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) } } }