From d348c48e4f1827dd666e76ebe8303d9175e56e90 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 22 Sep 2021 17:50:12 +0200 Subject: [PATCH] Analysis API: get rid of weak refs scheme for working with FIR internals for KtSymbol and KtType --- .../analysis/api/fir/KtSymbolByFirBuilder.kt | 3 +- .../symbols/KtFirAnonymousFunctionSymbol.kt | 3 +- .../fir/symbols/KtFirAnonymousObjectSymbol.kt | 3 +- .../fir/symbols/KtFirBackingFieldSymbol.kt | 5 +- .../api/fir/symbols/KtFirConstructorSymbol.kt | 3 +- .../api/fir/symbols/KtFirEnumEntrySymbol.kt | 3 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 3 +- .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 3 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 3 +- .../fir/symbols/KtFirLocalVariableSymbol.kt | 3 +- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 3 +- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 3 +- .../fir/symbols/KtFirPropertySetterSymbol.kt | 3 +- .../fir/symbols/KtFirSamConstructorSymbol.kt | 3 +- .../KtFirSyntheticJavaPropertySymbol.kt | 3 +- .../api/fir/symbols/KtFirTypeAliasSymbol.kt | 3 +- .../fir/symbols/KtFirTypeAndAnnotations.kt | 20 +++--- .../fir/symbols/KtFirTypeParameterSymbol.kt | 3 +- .../fir/symbols/KtFirValueParameterSymbol.kt | 3 +- .../analysis/api/fir/types/FirKtType.kt | 62 +++++++------------ .../api/fir/utils/FirRefWithValidityCheck.kt | 44 ++++--------- 21 files changed, 61 insertions(+), 121 deletions(-) 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 45528e44015..f8d419c1cb7 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 @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir import com.intellij.openapi.project.Project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.search.GlobalSearchScope +import com.intellij.util.containers.ContainerUtil import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument import org.jetbrains.kotlin.analysis.api.KtTypeArgument import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance @@ -411,7 +412,7 @@ private class BuilderCache private constructor( private val cache: ConcurrentMap, private val isReadOnly: Boolean ) { - constructor() : this(ConcurrentHashMap(), isReadOnly = false) + constructor() : this(ContainerUtil.createConcurrentSoftMap(), isReadOnly = false) fun createReadOnlyCopy(): BuilderCache { check(!isReadOnly) { "Cannot create readOnly BuilderCache from a readonly one" } 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 5523b9a42c7..30e5847fd34 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 @@ -26,9 +26,8 @@ internal class KtFirAnonymousFunctionSymbol( fir: FirAnonymousFunction, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtAnonymousFunctionSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } 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 505e60488b0..0a44a559a3b 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 @@ -29,9 +29,8 @@ internal class KtFirAnonymousObjectSymbol( fir: FirAnonymousObject, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtAnonymousObjectSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirBackingFieldSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirBackingFieldSymbol.kt index 70cd0f2fdb1..f67b8dc700f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirBackingFieldSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirBackingFieldSymbol.kt @@ -23,9 +23,8 @@ internal class KtFirBackingFieldSymbol( propertyFir: FirProperty, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder -) : KtBackingFieldSymbol(){ - private val builder by weakRef(_builder) + private val builder: KtSymbolByFirBuilder +) : KtBackingFieldSymbol() { private val propertyFirRef = firRef(propertyFir, resolveState) override val annotatedType: KtTypeAndAnnotations by cached { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt index 9468e9385d7..950e683ed76 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirConstructorSymbol.kt @@ -39,9 +39,8 @@ internal class KtFirConstructorSymbol( fir: FirConstructor, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtConstructorSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt index 5e85d63c24f..44f2598bca6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirEnumEntrySymbol.kt @@ -29,9 +29,8 @@ internal class KtFirEnumEntrySymbol( fir: FirEnumEntry, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtEnumEntrySymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt index c43a8f003eb..cc7edd72c3b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt @@ -40,9 +40,8 @@ internal class KtFirFunctionSymbol( fir: FirSimpleFunction, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtFunctionSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } override val name: Name get() = firRef.withFir { it.name } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt index 101275220fa..9c56c6b22e0 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -30,9 +30,8 @@ internal class KtFirJavaFieldSymbol( fir: FirField, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtJavaFieldSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 2734e46be44..f34f4536ed6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -44,14 +44,13 @@ internal class KtFirKotlinPropertySymbol( fir: FirProperty, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtKotlinPropertySymbol(), KtFirSymbol { init { assert(!fir.isLocal) check(fir !is FirSyntheticProperty) } - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } 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 8d3eae7f370..b8703b37bbd 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 @@ -27,14 +27,13 @@ internal class KtFirLocalVariableSymbol( fir: FirProperty, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtLocalVariableSymbol(), KtFirSymbol { init { assert(fir.isLocal) } - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 4ddf63d0ca3..e4609ed9682 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -38,9 +38,8 @@ internal class KtFirNamedClassOrObjectSymbol( fir: FirRegularClass, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtNamedClassOrObjectSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } override val name: Name get() = firRef.withFir { it.name } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt index cabf53fa3b2..6ec18e77b15 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -39,13 +39,12 @@ internal class KtFirPropertyGetterSymbol( fir: FirPropertyAccessor, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtPropertyGetterSymbol(), KtFirSymbol { init { require(fir.isGetter) } - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt index a6d6ed6b5a6..c0f689747d5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -39,13 +39,12 @@ internal class KtFirPropertySetterSymbol( fir: FirPropertyAccessor, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtPropertySetterSymbol(), KtFirSymbol { init { require(fir.isSetter) } - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt index 6e86fda95d3..87077dbeeca 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSamConstructorSymbol.kt @@ -29,9 +29,8 @@ internal class KtFirSamConstructorSymbol( fir: FirSimpleFunction, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtSamConstructorSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } override val name: Name get() = firRef.withFir { it.name } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index 6e943ec579a..6008655f325 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -40,9 +40,8 @@ internal class KtFirSyntheticJavaPropertySymbol( fir: FirSyntheticProperty, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtSyntheticJavaPropertySymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt index 6ef96ac33e6..152ab072b9b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAliasSymbol.kt @@ -29,9 +29,8 @@ internal class KtFirTypeAliasSymbol( fir: FirTypeAlias, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtTypeAliasSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt index e62b0df96ee..26e441ba901 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeAndAnnotations.kt @@ -20,14 +20,14 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion internal class KtFirTypeAndAnnotations( private val containingDeclaration: FirRefWithValidityCheck, @Suppress("UNUSED_PARAMETER") typeResolvePhase: FirResolvePhase, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, private val typeRef: (T) -> FirTypeRef, ) : KtTypeAndAnnotations() { - private val builder by weakRef(_builder) override val token: ValidityToken get() = containingDeclaration.token @@ -43,20 +43,16 @@ internal class KtFirTypeAndAnnotations( } internal class KtSimpleFirTypeAndAnnotations( - coneType: ConeKotlinType, - annotationsList: List, - builder: KtSymbolByFirBuilder, + private val coneType: ConeKotlinType, + private val _annotations: List, + private val builder: KtSymbolByFirBuilder, override val token: ValidityToken ) : KtTypeAndAnnotations() { - - private val coneTypeRef by weakRef(coneType) - private val annotationsListRef by weakRef(annotationsList) - override val type: KtType by cached { - builder.typeBuilder.buildKtType(coneTypeRef) + builder.typeBuilder.buildKtType(coneType) } - override val annotations: List get() = annotationsListRef + override val annotations: List get() = withValidityAssertion { _annotations } } internal fun FirRefWithValidityCheck.superTypesAndAnnotationsList(builder: KtSymbolByFirBuilder): List = @@ -66,7 +62,7 @@ internal fun FirRefWithValidityCheck.superTypesAndAnnotationsList(buil internal fun FirRefWithValidityCheck.superTypesAndAnnotationsListForRegularClass(builder: KtSymbolByFirBuilder): List { return withFir { fir -> - if(fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) { + if (fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) { fir.superTypeRefs.mapToTypeAndAnnotations(this, builder) } else null } ?: withFirByType(ResolveType.NoResolve) { fir -> diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt index 6c208af3480..4c44655ef3f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirTypeParameterSymbol.kt @@ -25,9 +25,8 @@ internal class KtFirTypeParameterSymbol( fir: FirTypeParameter, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtTypeParameterSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt index 2f7db18949c..fac52a78165 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirValueParameterSymbol.kt @@ -34,9 +34,8 @@ internal class KtFirValueParameterSymbol( fir: FirValueParameter, resolveState: FirModuleResolveState, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder + private val builder: KtSymbolByFirBuilder ) : KtValueParameterSymbol(), KtFirSymbol { - private val builder by weakRef(_builder) override val firRef = firRef(fir, resolveState) override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/FirKtType.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/FirKtType.kt index 2e477b41138..9d6fb8d3f35 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/FirKtType.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/types/FirKtType.kt @@ -5,16 +5,11 @@ package org.jetbrains.kotlin.analysis.api.fir.types -import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType -import org.jetbrains.kotlin.fir.resolve.inference.receiverType -import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol -import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl -import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols import org.jetbrains.kotlin.analysis.api.KtTypeArgument import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol @@ -22,6 +17,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.* import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.fir.resolve.inference.isSuspendFunctionType +import org.jetbrains.kotlin.fir.resolve.inference.receiverType +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.fir.types.* +import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -38,13 +38,10 @@ private fun KtFirType.typeEquals(other: Any?): Boolean { private fun KtFirType.typeHashcode(): Int = token.hashCode() * 31 + coneType.hashCode() internal class KtFirUsualClassType( - _coneType: ConeClassLikeTypeImpl, + override val coneType: ConeClassLikeTypeImpl, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtUsualClassType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) - override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId } override val classSymbol: KtClassLikeSymbol by cached { builder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) @@ -63,13 +60,10 @@ internal class KtFirUsualClassType( } internal class KtFirFunctionalType( - _coneType: ConeClassLikeTypeImpl, + override val coneType: ConeClassLikeTypeImpl, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtFunctionalType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) - override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId } override val classSymbol: KtClassLikeSymbol by cached { builder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) @@ -116,12 +110,10 @@ internal class KtFirFunctionalType( } internal class KtFirClassErrorType( - _coneType: ConeClassErrorType, + override val coneType: ConeClassErrorType, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtClassErrorType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) override val error: String get() = withValidityAssertion { coneType.diagnostic.reason } override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() } @@ -137,10 +129,9 @@ internal class KtFirClassErrorType( } internal class KtFirCapturedType( - _coneType: ConeCapturedType, + override val coneType: ConeCapturedType, override val token: ValidityToken, ) : KtCapturedType(), KtFirType { - override val coneType by weakRef(_coneType) override val nullability: KtTypeNullability get() = withValidityAssertion { coneType.nullability.asKtNullability() } override fun asStringForDebugging(): String = withValidityAssertion { coneType.render() } override fun equals(other: Any?) = typeEquals(other) @@ -148,13 +139,10 @@ internal class KtFirCapturedType( } internal class KtFirDefinitelyNotNullType( - _coneType: ConeDefinitelyNotNullType, + override val coneType: ConeDefinitelyNotNullType, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtDefinitelyNotNullType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) - override val original: KtType by cached { builder.typeBuilder.buildKtType(this.coneType.original) } override fun asStringForDebugging(): String = withValidityAssertion { coneType.render() } @@ -163,13 +151,10 @@ internal class KtFirDefinitelyNotNullType( } internal class KtFirTypeParameterType( - _coneType: ConeTypeParameterType, + override val coneType: ConeTypeParameterType, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtTypeParameterType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) - override val name: Name get() = withValidityAssertion { coneType.lookupTag.name } override val symbol: KtTypeParameterSymbol by cached { builder.classifierBuilder.buildTypeParameterSymbolByLookupTag(coneType.lookupTag) @@ -184,12 +169,10 @@ internal class KtFirTypeParameterType( } internal class KtFirFlexibleType( - _coneType: ConeFlexibleType, + override val coneType: ConeFlexibleType, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtFlexibleType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) override val lowerBound: KtType by cached { builder.typeBuilder.buildKtType(coneType.lowerBound) } override val upperBound: KtType by cached { builder.typeBuilder.buildKtType(coneType.upperBound) } @@ -202,13 +185,10 @@ internal class KtFirFlexibleType( } internal class KtFirIntersectionType( - _coneType: ConeIntersectionType, + override val coneType: ConeIntersectionType, override val token: ValidityToken, - _builder: KtSymbolByFirBuilder, + private val builder: KtSymbolByFirBuilder, ) : KtIntersectionType(), KtFirType { - override val coneType by weakRef(_coneType) - private val builder by weakRef(_builder) - override val conjuncts: List by cached { coneType.intersectedTypes.map { conjunct -> builder.typeBuilder.buildKtType(conjunct) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt index 6f396c29e4f..760da3556a4 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt @@ -5,31 +5,23 @@ package org.jetbrains.kotlin.analysis.api.fir.utils -import org.jetbrains.annotations.TestOnly -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration -import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.tokens.assertIsValidAndAccessible -import java.lang.ref.WeakReference +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration +import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -internal class FirRefWithValidityCheck(fir: D, resolveState: FirModuleResolveState, val token: ValidityToken) { - private val firWeakRef = WeakReference(fir) - private val resolveStateWeakRef = WeakReference(resolveState) - - @TestOnly - internal fun isCollected(): Boolean = - firWeakRef.get() == null && resolveStateWeakRef.get() == null +internal class FirRefWithValidityCheck( + private val fir: D, + val resolveState: FirModuleResolveState, + val token: ValidityToken +) { inline fun withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline action: (fir: D) -> R): R { token.assertIsValidAndAccessible() - val fir = firWeakRef.get() - ?: throw EntityWasGarbageCollectedException("FirElement") - val resolveState = resolveStateWeakRef.get() - ?: throw EntityWasGarbageCollectedException("FirModuleResolveState") return fir.withFirDeclaration(resolveState, phase) { action(it) } } @@ -40,14 +32,9 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt */ inline fun withFirUnsafe(action: (fir: D) -> R): R { token.assertIsValidAndAccessible() - val fir = firWeakRef.get() - ?: throw EntityWasGarbageCollectedException("FirElement") return action(fir) } - val resolveState - get() = resolveStateWeakRef.get() ?: throw EntityWasGarbageCollectedException("FirModuleResolveState") - inline fun withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) = ValidityAwareCachedValue(token) { withFir(phase) { fir -> createValue(fir) } @@ -55,10 +42,6 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt inline fun withFirByType(type: ResolveType, crossinline action: (fir: D) -> R): R { token.assertIsValidAndAccessible() - val fir = firWeakRef.get() - ?: throw EntityWasGarbageCollectedException("FirElement") - val resolveState = resolveStateWeakRef.get() - ?: throw EntityWasGarbageCollectedException("FirModuleResolveState") return fir.withFirDeclaration(type, resolveState) { action(it) } } @@ -69,16 +52,13 @@ internal class FirRefWithValidityCheck(fir: D, resolveSt override fun equals(other: Any?): Boolean { if (other !is FirRefWithValidityCheck<*>) return false - return getRefFir() == other.getRefFir() && this.token == other.token + return fir == other.fir && this.token == other.token } override fun hashCode(): Int { - return getRefFir().hashCode() * 31 + token.hashCode() + return fir.hashCode() * 31 + token.hashCode() } - private fun getRefFir(): FirDeclaration { - return firWeakRef.get() ?: throw EntityWasGarbageCollectedException("FirElement") - } } @Suppress("NOTHING_TO_INLINE")