From 2e35e513ee902f117be79fd5319489801dd16c96 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 7 Jun 2022 17:46:43 +0200 Subject: [PATCH] [analysis api fir] get rid of read only FirDeclaration -> KtSymbol used for completion --- .../analysis/api/fir/KtFirAnalysisSession.kt | 10 ++-- .../analysis/api/fir/KtSymbolByFirBuilder.kt | 51 +++---------------- 2 files changed, 10 insertions(+), 51 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt index 38c2d0169da..10573913814 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSession.kt @@ -31,11 +31,12 @@ internal class KtFirAnalysisSession private constructor( private val project: Project, val firResolveSession: LLFirResolveSession, - internal val firSymbolBuilder: KtSymbolByFirBuilder, token: KtLifetimeToken, private val mode: AnalysisSessionMode, ) : KtAnalysisSession(token) { + internal val firSymbolBuilder: KtSymbolByFirBuilder = KtSymbolByFirBuilder(firResolveSession, project, token) + @Suppress("AnalysisApiMissingLifetimeCheck") override val useSiteModule: KtModule get() = firResolveSession.useSiteKtModule @@ -135,15 +136,10 @@ private constructor( token: KtLifetimeToken, ): KtFirAnalysisSession { val project = firResolveSession.project - val firSymbolBuilder = KtSymbolByFirBuilder( - firResolveSession, - project, - token - ) + return KtFirAnalysisSession( project, firResolveSession, - firSymbolBuilder, token, AnalysisSessionMode.REGULAR, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt index 1e1a2502395..cb54f82510a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtSymbolByFirBuilder.kt @@ -56,15 +56,15 @@ internal class KtSymbolByFirBuilder private constructor( private val project: Project, private val firResolveSession: LLFirResolveSession, val token: KtLifetimeToken, - val withReadOnlyCaching: Boolean, - private val symbolsCache: BuilderCache, KtSymbol>, - private val extensionReceiverSymbolsCache: BuilderCache, KtSymbol>, - private val filesCache: BuilderCache, - private val backingFieldCache: BuilderCache, ) { private val firProvider get() = firResolveSession.useSiteFirSession.symbolProvider val rootSession: FirSession = firResolveSession.useSiteFirSession + private val symbolsCache = BuilderCache, KtSymbol>() + private val extensionReceiverSymbolsCache = BuilderCache, KtSymbol>() + private val filesCache = BuilderCache() + private val backingFieldCache = BuilderCache() + val classifierBuilder = ClassifierSymbolBuilder() val functionLikeBuilder = FunctionLikeSymbolBuilder() val variableLikeBuilder = VariableLikeSymbolBuilder() @@ -72,35 +72,6 @@ internal class KtSymbolByFirBuilder private constructor( val anonymousInitializerBuilder = AnonymousInitializerBuilder() val typeBuilder = TypeBuilder() - constructor( - firResolveSession: LLFirResolveSession, - project: Project, - token: KtLifetimeToken - ) : this( - project = project, - token = token, - firResolveSession = firResolveSession, - withReadOnlyCaching = false, - symbolsCache = BuilderCache(), - extensionReceiverSymbolsCache = BuilderCache(), - backingFieldCache = BuilderCache(), - filesCache = BuilderCache(), - ) - - fun createReadOnlyCopy(newFirResolveSession: LLFirResolveSession): KtSymbolByFirBuilder { - check(!withReadOnlyCaching) { "Cannot create readOnly KtSymbolByFirBuilder from a readonly one" } - return KtSymbolByFirBuilder( - project, - token = token, - firResolveSession = newFirResolveSession, - withReadOnlyCaching = true, - symbolsCache = symbolsCache.createReadOnlyCopy(), - extensionReceiverSymbolsCache = extensionReceiverSymbolsCache.createReadOnlyCopy(), - filesCache = filesCache.createReadOnlyCopy(), - backingFieldCache = backingFieldCache.createReadOnlyCopy(), - ) - } - fun buildSymbol(fir: FirDeclaration): KtSymbol = buildSymbol(fir.symbol) @@ -618,19 +589,11 @@ internal class KtSymbolByFirBuilder private constructor( private class BuilderCache private constructor( private val cache: ConcurrentMap, - private val isReadOnly: Boolean ) { - constructor() : this(ContainerUtil.createConcurrentSoftMap(), isReadOnly = false) - - fun createReadOnlyCopy(): BuilderCache { - check(!isReadOnly) { "Cannot create readOnly BuilderCache from a readonly one" } - return BuilderCache(cache, isReadOnly = true) - } + constructor() : this(ContainerUtil.createConcurrentSoftMap()) inline fun cache(key: From, calculation: () -> S): S { - val value = if (isReadOnly) { - cache[key] ?: calculation() - } else cache.getOrPut(key, calculation) + val value = cache.getOrPut(key, calculation) return value as? S ?: error("Cannot cast ${value::class} to ${S::class}\n${DebugSymbolRenderer.render(value as KtSymbol)}") }