From 2290d2fcc0c32320bebdf3a029243803638366e0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 18 Aug 2020 15:37:57 +0300 Subject: [PATCH] FIR IDE: make FirScopeRegistry belong to a KtFirScopeProvider --- .../frontend/api/fir/KtFirAnalysisSession.kt | 15 +-------------- .../api/fir/components/KtFirScopeProvider.kt | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt index ef35bfd513c..35db1429718 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtFirAnalysisSession.kt @@ -33,14 +33,13 @@ private constructor( } private val project = element.project - private val firScopeStorage = FirScopeRegistry() override val smartCastProvider: KtSmartCastProvider = KtFirSmartcastProvider(this) override val typeProvider: KtTypeProvider = KtFirTypeProvider(this) override val diagnosticProvider: KtDiagnosticProvider = KtFirDiagnosticProvider(this) override val containingDeclarationProvider = KtFirSymbolContainingDeclarationProvider(this) override val callResolver: KtCallResolver = KtFirCallResolver(this) - override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState, firScopeStorage) } + override val scopeProvider by threadLocal { KtFirScopeProvider(this, firSymbolBuilder, project, firResolveState) } override val symbolProvider: KtSymbolProvider = KtFirSymbolProvider(token, firResolveState.firIdeLibrariesSession.firSymbolProvider, firResolveState, firSymbolBuilder) @@ -79,15 +78,3 @@ private constructor( } } -/** - * Stores strong references to all instances of [FirScope] used - * Needed as the only entity which may have a strong references to FIR internals is [KtFirAnalysisSession] - * Entities which needs storing [FirScope] instances will store them as weak references via [org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef] - */ -internal class FirScopeRegistry { - private val scopes = mutableListOf() - - fun register(scope: FirScope) { - scopes += scope - } -} \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index 03dc7103438..d4e20919964 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.components.KtScopeContext import org.jetbrains.kotlin.idea.frontend.api.components.KtScopeProvider -import org.jetbrains.kotlin.idea.frontend.api.fir.FirScopeRegistry +import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.scopes.* import org.jetbrains.kotlin.idea.frontend.api.fir.scopes.KtFirDeclaredMemberScope @@ -55,11 +55,10 @@ internal class KtFirScopeProvider( private val builder: KtSymbolByFirBuilder, private val project: Project, firResolveState: FirModuleResolveState, - firScopeRegistry: FirScopeRegistry, ) : KtScopeProvider(), ValidityTokenOwner { override val analysisSession: KtAnalysisSession by analysisSession.weakRef(analysisSession) private val firResolveState by weakRef(firResolveState) - private val firScopeStorage by weakRef(firScopeRegistry) + private val firScopeStorage = FirScopeRegistry() private val memberScopeCache = IdentityHashMap() private val declaredMemberScopeCache = IdentityHashMap() @@ -162,3 +161,16 @@ private class KtFirDelegatingScopeImpl( ) : KtFirDelegatingScope(builder, token), ValidityTokenOwner where S : FirContainingNamesAwareScope, S : FirScope { override val firScope: S by weakRef(firScope) } + +/** + * Stores strong references to all instances of [FirScope] used + * Needed as the only entity which may have a strong references to FIR internals is [KtFirAnalysisSession] & [KtAnalysisSessionComponent] + * Entities which needs storing [FirScope] instances will store them as weak references via [org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef] + */ +internal class FirScopeRegistry { + private val scopes = mutableListOf() + + fun register(scope: FirScope) { + scopes += scope + } +}