From 3772d60ca633112a11b04b0a8d6b72b931cc4680 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 3 Feb 2023 13:21:45 +0100 Subject: [PATCH] [Analysis API] optimize RAM consumption for some KtFirSymbol's Remove psi caching for local declarations as it's fast to get the psi for those. Local declarations cannot be from the library, so we do not need to search for deserialized psi for those. ^KTIJ-22749 --- .../src/org/jetbrains/kotlin/analysis/api/fir/psiUtils.kt | 2 +- .../analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt | 4 ++-- .../analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt | 4 ++-- .../analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt | 5 ++--- .../kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt | 4 ++-- .../analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt | 5 ++--- .../analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt | 4 ++-- 7 files changed, 13 insertions(+), 15 deletions(-) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/psiUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/psiUtils.kt index fc320222340..10d3cef99f3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/psiUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/psiUtils.kt @@ -29,7 +29,7 @@ private val allowedFakeElementKinds = setOf( KtFakeSourceElementKind.ImplicitConstructor, ) -private fun FirElement.getAllowedPsi() = when (val source = source) { +internal fun FirElement.getAllowedPsi() = when (val source = source) { null -> null is KtRealPsiSourceElement -> source.psi is KtFakeSourceElement -> if (source.kind in allowedFakeElementKinds) psi else null diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt index 271e0317476..f685f088ffc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousFunctionSymbol.kt @@ -11,7 +11,7 @@ import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration -import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.getAllowedPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol @@ -30,7 +30,7 @@ internal class KtFirAnonymousFunctionSymbol( override val analysisSession: KtFirAnalysisSession, ) : KtAnonymousFunctionSymbol(), KtFirSymbol { - override val psi: PsiElement? by cached { firSymbol.fir.findPsi(firSymbol.fir.moduleData.session) } + override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() } override val annotationsList: KtAnnotationsList get() = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt index e4ca843d247..b4261cc57ec 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirAnonymousObjectSymbol.kt @@ -10,7 +10,7 @@ import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration -import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.getAllowedPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirEnumEntryInitializerSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.requireOwnerPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached @@ -26,7 +26,7 @@ internal class KtFirAnonymousObjectSymbol( override val firSymbol: FirAnonymousObjectSymbol, override val analysisSession: KtFirAnalysisSession, ) : KtAnonymousObjectSymbol(), KtFirSymbol { - override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() } override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, analysisSession.useSiteSession, token) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt index ad1974c5f43..1afb82e753f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirClassInitializerSymbol.kt @@ -9,8 +9,7 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.fir.getAllowedPsi import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol @@ -25,7 +24,7 @@ internal class KtFirClassInitializerSymbol( override val firSymbol: FirAnonymousInitializerSymbol, override val analysisSession: KtFirAnalysisSession, ) : KtClassInitializerSymbol(), KtFirSymbol { - override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() } context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt index 907a2c8dc5b..be1eff7326b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFileSymbol.kt @@ -9,20 +9,20 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration -import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclarations import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol internal class KtFirFileSymbol( override val firSymbol: FirFileSymbol, override val analysisSession: KtFirAnalysisSession, ) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol { - override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.psi } context(KtAnalysisSession) override fun createPointer(): KtSymbolPointer = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt index 871f1b655e7..a2a0dd43cd1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirLocalVariableSymbol.kt @@ -10,8 +10,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.api.fir.utils.cached +import org.jetbrains.kotlin.analysis.api.fir.getAllowedPsi import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind @@ -31,7 +30,7 @@ internal class KtFirLocalVariableSymbol( assert(firSymbol.isLocal) } - override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() } override val annotationsList: KtAnnotationsList get() = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt index 91a380ece1a..3d34753ffeb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirReceiverParameterSymbol.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForReceiverParameter -import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirReceiverParameterSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeOwner @@ -21,6 +20,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol internal class KtFirReceiverParameterSymbol( @@ -28,7 +28,7 @@ internal class KtFirReceiverParameterSymbol( val analysisSession: KtFirAnalysisSession, ) : KtReceiverParameterSymbol(), KtLifetimeOwner { override val token: KtLifetimeToken get() = analysisSession.token - override val psi: PsiElement? by cached { firSymbol.fir.receiverParameter?.typeRef?.findPsi(firSymbol.fir.moduleData.session) } + override val psi: PsiElement? = withValidityAssertion{ firSymbol.fir.receiverParameter?.typeRef?.psi } init { require(firSymbol.fir.receiverParameter != null) { "$firSymbol doesn't have an extension receiver." }