[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
This commit is contained in:
Ilya Kirillov
2023-02-03 13:21:45 +01:00
committed by Space Team
parent 3d3ab5d379
commit 3772d60ca6
7 changed files with 13 additions and 15 deletions
@@ -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
@@ -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<FirAnonymousFunctionSymbol> {
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 {
@@ -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<FirAnonymousObjectSymbol> {
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)
@@ -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<FirAnonymousInitializerSymbol> {
override val psi: PsiElement? by cached { firSymbol.findPsi() }
override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.getAllowedPsi() }
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtSymbol> = withValidityAssertion {
@@ -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<FirFileSymbol> {
override val psi: PsiElement? by cached { firSymbol.findPsi() }
override val psi: PsiElement? = withValidityAssertion { firSymbol.fir.psi }
context(KtAnalysisSession)
override fun createPointer(): KtSymbolPointer<KtFileSymbol> = withValidityAssertion {
@@ -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 {
@@ -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." }