From 16fbc099972e7310c2c617fddd1341b4021768fd Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 20 Jan 2022 15:47:11 +0100 Subject: [PATCH] Analysis API: use FirSymbol in KtFirSymbol's instead of FirDeclaration ^KT-50271 fixed --- .../fir/generator/HLDiagnosticConverter.kt | 32 +- ...deDeserializedDeclarationSourceProvider.kt | 5 + .../api/fir/KtFirAnalysisSessionProvider.kt | 8 +- .../analysis/api/fir/KtSymbolByFirBuilder.kt | 317 ++++++++--------- .../KtFirAnnotationListForDeclaration.kt | 44 ++- .../api/fir/components/KtFirCallResolver.kt | 31 +- .../KtFirCompletionCandidateChecker.kt | 13 +- .../components/KtFirExpressionInfoProvider.kt | 12 +- .../fir/components/KtFirInheritorsProvider.kt | 8 +- .../fir/components/KtFirReferenceShortener.kt | 4 +- .../api/fir/components/KtFirSamResolver.kt | 14 +- .../api/fir/components/KtFirScopeProvider.kt | 59 ++-- ...tFirSymbolContainingDeclarationProvider.kt | 21 +- ...KtFirSymbolDeclarationOverridesProvider.kt | 54 +-- .../KtFirSymbolDeclarationRendererProvider.kt | 6 +- .../fir/components/KtFirSymbolInfoProvider.kt | 55 ++- .../api/fir/components/KtFirTypeCreator.kt | 8 +- .../api/fir/components/KtFirTypeProvider.kt | 34 +- .../fir/components/KtFirVisibilityChecker.kt | 54 ++- .../diagnostics/KtFirDataClassConverters.kt | 322 +++++++++--------- .../references/FirReferenceResolveHelper.kt | 16 +- .../api/fir/references/KtFirReference.kt | 4 +- .../api/fir/scopes/KtFirDelegatingScope.kt | 20 +- .../analysis/api/fir/scopes/KtFirFileScope.kt | 52 +-- .../fir/scopes/KtFirNonStarImportingScope.kt | 1 - .../symbols/KtFirAnonymousFunctionSymbol.kt | 45 ++- .../fir/symbols/KtFirAnonymousObjectSymbol.kt | 23 +- .../fir/symbols/KtFirArrayOfSymbolProvider.kt | 8 +- .../fir/symbols/KtFirBackingFieldSymbol.kt | 31 +- .../symbols/KtFirClassInitializerSymbol.kt | 13 +- .../api/fir/symbols/KtFirConstructorSymbol.kt | 47 ++- .../api/fir/symbols/KtFirEnumEntrySymbol.kt | 43 +-- .../api/fir/symbols/KtFirFileSymbol.kt | 16 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 101 +++--- .../api/fir/symbols/KtFirJavaFieldSymbol.kt | 44 ++- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 113 +++--- .../fir/symbols/KtFirLocalVariableSymbol.kt | 29 +- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 116 ++++--- .../fir/symbols/KtFirOverrideInfoProvider.kt | 54 ++- .../api/fir/symbols/KtFirPackageSymbol.kt | 7 +- .../fir/symbols/KtFirPropertyGetterSymbol.kt | 54 ++- .../fir/symbols/KtFirPropertySetterSymbol.kt | 54 ++- .../symbols/KtFirReceiverParameterSymbol.kt | 20 +- .../fir/symbols/KtFirSamConstructorSymbol.kt | 57 ++-- .../analysis/api/fir/symbols/KtFirSymbol.kt | 15 +- .../api/fir/symbols/KtFirSymbolProvider.kt | 49 ++- .../KtFirSyntheticJavaPropertySymbol.kt | 86 +++-- .../api/fir/symbols/KtFirTypeAliasSymbol.kt | 49 ++- .../fir/symbols/KtFirTypeAndAnnotations.kt | 41 +-- .../fir/symbols/KtFirTypeParameterSymbol.kt | 30 +- .../fir/symbols/KtFirValueParameterSymbol.kt | 105 +++--- .../api/fir/symbols/firSymbolUtils.kt | 73 ++-- .../KtFirBackingFieldSymbolPointer.kt | 4 +- .../pointers/KtFirConstructorSymbolPointer.kt | 6 +- .../pointers/KtFirEnumEntrySymbolPointer.kt | 8 +- .../pointers/KtFirJavaFieldSymbolPointer.kt | 2 +- ...KtFirJavaSyntheticPropertySymbolPointer.kt | 2 +- .../KtFirMemberFunctionSymbolPointer.kt | 6 +- .../KtFirMemberPropertySymbolPointer.kt | 9 +- .../pointers/KtFirMemberSymbolPointer.kt | 8 +- .../KtFirSamConstructorSymbolPointer.kt | 4 +- .../KtFirTopLevelFunctionSymbolPointer.kt | 10 +- .../api/fir/symbols/pointers/pointerUtils.kt | 3 + .../analysis/api/fir/types/FirKtType.kt | 4 +- .../api/fir/utils/FirRefWithValidityCheck.kt | 66 ---- .../KtAnalysisSessionFe10BindingHolder.kt | 16 +- .../analysis/api/fir/utils/LazyOnlyWeakRef.kt | 2 +- .../api/fir/utils/ValidityAwareCachedValue.kt | 2 +- .../kotlin/analysis/api/fir/utils/firUtils.kt | 22 +- .../api/symbols/KtVariableLikeSymbol.kt | 2 + .../api/fir/api/FirDeclarationDesignation.kt | 5 +- .../fir/api/InvalidFirElementTypeException.kt | 16 +- .../level/api/fir/api/LowLevelFirApiFacade.kt | 21 +- .../fir/element/builder/FirElementBuilder.kt | 1 - .../resolve/FirLazyDeclarationResolver.kt | 13 +- .../analysis/low/level/api/fir/util/utils.kt | 1 - .../utils/FirSymbolStatusUtils.kt | 1 + .../kotlin/fir/symbols/FirBasedSymbol.kt | 16 + .../fir/symbols/impl/FirCallableSymbol.kt | 4 + .../fir/symbols/impl/FirClassLikeSymbol.kt | 8 +- .../fir/symbols/impl/FirFunctionSymbol.kt | 5 +- .../fir/symbols/impl/FirVariableSymbol.kt | 9 + 82 files changed, 1359 insertions(+), 1434 deletions(-) delete mode 100644 analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt diff --git a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/HLDiagnosticConverter.kt b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/HLDiagnosticConverter.kt index ed1f4bf66d8..6b316320566 100644 --- a/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/HLDiagnosticConverter.kt +++ b/analysis/analysis-api-fir/analysis-api-fir-generator/src/org/jetbrains/kotlin/analysis/api/fir/generator/HLDiagnosticConverter.kt @@ -189,20 +189,20 @@ private object FirToKtConversionCreator { private val typeMapping: Map, HLFunctionCallConversion> = mapOf( FirBasedSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildSymbol({0}.fir)", + "firSymbolBuilder.buildSymbol({0})", KtSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") ), FirClass::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.symbol)", KtClassLikeSymbol::class.createType() ), FirClassSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir)", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})", KtClassLikeSymbol::class.createType() ), FirRegularClass::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}) as KtNamedClassOrObjectSymbol", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.symbol) as KtNamedClassOrObjectSymbol", KtNamedClassOrObjectSymbol::class.createType(), importsToAdd = listOf( "org.jetbrains.kotlin.fir.declarations.FirRegularClass", @@ -226,26 +226,26 @@ private object FirToKtConversionCreator { ) ), FirValueParameter::class to HLFunctionCallConversion( - "firSymbolBuilder.buildSymbol({0})", + "firSymbolBuilder.buildSymbol({0}.symbol)", KtSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") ), FirValueParameterSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildSymbol({0}.fir)", + "firSymbolBuilder.buildSymbol({0})", KtSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") ), FirEnumEntrySymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildSymbol({0}.fir)", + "firSymbolBuilder.buildSymbol({0})", KtSymbol::class.createType(), ), FirClassLikeSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir as FirClass)", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})", KtClassLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirClass") ), FirRegularClassSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir)", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})", KtClassLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirRegularClass") ), @@ -260,17 +260,17 @@ private object FirToKtConversionCreator { importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration") ), FirCallableSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.callableBuilder.buildCallableSymbol({0}.fir)", + "firSymbolBuilder.callableBuilder.buildCallableSymbol({0})", KtCallableSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration") ), FirTypeParameterSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)", + "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0})", KtTypeParameterSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter") ), FirTypeParameter::class to HLFunctionCallConversion( - "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)", + "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0})", KtTypeParameterSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter") ), @@ -283,17 +283,17 @@ private object FirToKtConversionCreator { KtType::class.createType() ), FirPropertySymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir)", + "firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0})", KtVariableSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirProperty") ), FirBackingFieldSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir.propertySymbol.fir)", + "firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir.propertySymbol)", KtVariableSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirProperty") ), FirVariableSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol({0}.fir)", + "firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol({0})", KtVariableLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirVariable") ), @@ -308,7 +308,7 @@ private object FirToKtConversionCreator { importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirSimpleFunction") ), FirNamedFunctionSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol({0}.fir)", + "firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol({0})", KtFunctionLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirSimpleFunction") ), diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirIdeDeserializedDeclarationSourceProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirIdeDeserializedDeclarationSourceProvider.kt index f23c3bc26f6..bea4928d0f8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirIdeDeserializedDeclarationSourceProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirIdeDeserializedDeclarationSourceProvider.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSession import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -157,6 +158,10 @@ private fun FirElement.getAllowedPsi() = when (val source = source) { fun FirElement.findPsi(project: Project): PsiElement? = getAllowedPsi() ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, project) + +fun FirBasedSymbol<*>.findPsi(): PsiElement? = + fir.findPsi(fir.moduleData.session) + fun FirElement.findPsi(session: FirSession): PsiElement? = findPsi((session as FirIdeSession).project) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt index 789e8826eb9..706c02f86cc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/KtFirAnalysisSessionProvider.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.impl.base.CachingKtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol @@ -23,8 +24,11 @@ class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionP } override fun getResolveState(contextSymbol: KtSymbol): FirModuleResolveState { - require(contextSymbol is KtFirSymbol<*>) - return contextSymbol.firRef.resolveState + return when (contextSymbol) { + is KtFirSymbol<*> -> contextSymbol.resolveState + is KtFirBackingFieldSymbol -> contextSymbol.resolveState + else -> error("Invalid symbol ${contextSymbol::class}") + } } override fun createAnalysisSession( 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 d1a51fbb9c4..5b8bb9bf7da 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 @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef -import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.java.declarations.FirJavaField import org.jetbrains.kotlin.fir.resolve.getContainingClass import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag @@ -37,9 +36,9 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ensureResolved -import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid @@ -58,10 +57,10 @@ internal class KtSymbolByFirBuilder private constructor( resolveState: FirModuleResolveState, override val token: ValidityToken, val withReadOnlyCaching: Boolean, - private val symbolsCache: BuilderCache, - private val extensionReceiverSymbolsCache: BuilderCache, - private val filesCache: BuilderCache, - private val backingFieldCache: BuilderCache, + private val symbolsCache: BuilderCache, KtSymbol>, + private val extensionReceiverSymbolsCache: BuilderCache, KtSymbol>, + private val filesCache: BuilderCache, + private val backingFieldCache: BuilderCache, private val typesCache: BuilderCache, ) : ValidityTokenOwner { private val resolveState by weakRef(resolveState) @@ -107,18 +106,22 @@ internal class KtSymbolByFirBuilder private constructor( ) } - fun buildSymbol(fir: FirDeclaration): KtSymbol { - return when (fir) { - is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir) - is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir) - is FirCallableDeclaration -> callableBuilder.buildCallableSymbol(fir) - else -> throwUnexpectedElementError(fir) + fun buildSymbol(fir: FirDeclaration): KtSymbol = + buildSymbol(fir.symbol) + + fun buildSymbol(firSymbol: FirBasedSymbol<*>): KtSymbol { + return when (firSymbol) { + is FirClassLikeSymbol<*> -> classifierBuilder.buildClassLikeSymbol(firSymbol) + is FirTypeParameterSymbol -> classifierBuilder.buildTypeParameterSymbol(firSymbol) + is FirCallableSymbol<*> -> callableBuilder.buildCallableSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) } + fun buildEnumEntrySymbol(firSymbol: FirEnumEntrySymbol) = + symbolsCache.cache(firSymbol) { KtFirEnumEntrySymbol(firSymbol, resolveState, token, this) } - fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) } + fun buildFileSymbol(firSymbol: FirFileSymbol) = filesCache.cache(firSymbol) { KtFirFileSymbol(firSymbol, resolveState, token) } private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope @@ -138,105 +141,105 @@ internal class KtSymbolByFirBuilder private constructor( inner class ClassifierSymbolBuilder { fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol { - return when (val fir = firSymbol.fir) { - is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir) - is FirTypeParameter -> buildTypeParameterSymbol(fir) - else -> throwUnexpectedElementError(fir) + return when (firSymbol) { + is FirClassLikeSymbol<*> -> classifierBuilder.buildClassLikeSymbol(firSymbol) + is FirTypeParameterSymbol -> buildTypeParameterSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildClassLikeSymbol(fir: FirClassLikeDeclaration): KtClassLikeSymbol { - return when (fir) { - is FirClass -> buildClassOrObjectSymbol(fir) - is FirTypeAlias -> buildTypeAliasSymbol(fir) - else -> throwUnexpectedElementError(fir) + fun buildClassLikeSymbol(firSymbol: FirClassLikeSymbol<*>): KtClassLikeSymbol { + return when (firSymbol) { + is FirClassSymbol<*> -> buildClassOrObjectSymbol(firSymbol) + is FirTypeAliasSymbol -> buildTypeAliasSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildClassOrObjectSymbol(fir: FirClass): KtClassOrObjectSymbol { - return when (fir) { - is FirAnonymousObject -> buildAnonymousObjectSymbol(fir) - is FirRegularClass -> buildNamedClassOrObjectSymbol(fir) - else -> throwUnexpectedElementError(fir) + fun buildClassOrObjectSymbol(firSymbol: FirClassSymbol<*>): KtClassOrObjectSymbol { + return when (firSymbol) { + is FirAnonymousObjectSymbol -> buildAnonymousObjectSymbol(firSymbol) + is FirRegularClassSymbol -> buildNamedClassOrObjectSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol { - return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildNamedClassOrObjectSymbol(symbol: FirRegularClassSymbol): KtFirNamedClassOrObjectSymbol { + return symbolsCache.cache(symbol) { KtFirNamedClassOrObjectSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol { - return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildAnonymousObjectSymbol(symbol: FirAnonymousObjectSymbol): KtAnonymousObjectSymbol { + return symbolsCache.cache(symbol) { KtFirAnonymousObjectSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildTypeAliasSymbol(fir: FirTypeAlias): KtFirTypeAliasSymbol { - return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildTypeAliasSymbol(symbol: FirTypeAliasSymbol): KtFirTypeAliasSymbol { + return symbolsCache.cache(symbol) { KtFirTypeAliasSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildTypeParameterSymbol(fir: FirTypeParameter): KtFirTypeParameterSymbol { - return symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildTypeParameterSymbol(firSymbol: FirTypeParameterSymbol): KtFirTypeParameterSymbol { + return symbolsCache.cache(firSymbol) { KtFirTypeParameterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? { val firTypeParameterSymbol = firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol ?: return null - return buildTypeParameterSymbol(firTypeParameterSymbol.fir) + return buildTypeParameterSymbol(firTypeParameterSymbol) } fun buildClassLikeSymbolByClassId(classId: ClassId): KtClassLikeSymbol? { val firClassLikeSymbol = firProvider.getClassLikeSymbolByClassId(classId) ?: return null - return buildClassLikeSymbol(firClassLikeSymbol.fir) + return buildClassLikeSymbol(firClassLikeSymbol) } fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? { val firClassLikeSymbol = firProvider.getSymbolByLookupTag(lookupTag) ?: return null - return buildClassLikeSymbol(firClassLikeSymbol.fir) + return buildClassLikeSymbol(firClassLikeSymbol) } } inner class FunctionLikeSymbolBuilder { - fun buildFunctionLikeSymbol(fir: FirFunction): KtFunctionLikeSymbol { - return when (fir) { - is FirSimpleFunction -> { - if (fir.origin == FirDeclarationOrigin.SamConstructor) { - buildSamConstructorSymbol(fir) + fun buildFunctionLikeSymbol(firSymbol: FirFunctionSymbol<*>): KtFunctionLikeSymbol { + return when (firSymbol) { + is FirNamedFunctionSymbol -> { + if (firSymbol.origin == FirDeclarationOrigin.SamConstructor) { + buildSamConstructorSymbol(firSymbol) } else { - buildFunctionSymbol(fir) + buildFunctionSymbol(firSymbol) } } - is FirConstructor -> buildConstructorSymbol(fir) - is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir) - is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) - else -> throwUnexpectedElementError(fir) + is FirConstructorSymbol -> buildConstructorSymbol(firSymbol) + is FirAnonymousFunctionSymbol -> buildAnonymousFunctionSymbol(firSymbol) + is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildFunctionLikeSignature(fir: FirFunction): KtFunctionLikeSignature { - if (fir is FirSimpleFunction && fir.origin != FirDeclarationOrigin.SamConstructor) + fun buildFunctionLikeSignature(fir: FirFunctionSymbol<*>): KtFunctionLikeSignature { + if (fir is FirNamedFunctionSymbol && fir.origin != FirDeclarationOrigin.SamConstructor) return buildFunctionSignature(fir) return buildFunctionLikeSymbol(fir).toSignature() } - fun buildFunctionSymbol(fir: FirSimpleFunction): KtFirFunctionSymbol { - fir.unwrapSubstitutionOverrideIfNeeded()?.let { - return buildFunctionSymbol(it) + fun buildFunctionSymbol(firSymbol: FirNamedFunctionSymbol): KtFirFunctionSymbol { + firSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let { + return buildFunctionSymbol(it.symbol) } - if (fir.dispatchReceiverType?.contains { it is ConeStubType } == true) { - return buildFunctionSymbol(fir.originalIfFakeOverride() ?: error("Stub type in real declaration")) + if (firSymbol.dispatchReceiverType?.contains { it is ConeStubType } == true) { + return buildFunctionSymbol(firSymbol.originalIfFakeOverride() ?: error("Stub type in real declaration")) } - check(fir.origin != FirDeclarationOrigin.SamConstructor) - return symbolsCache.cache(fir) { KtFirFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + check(firSymbol.origin != FirDeclarationOrigin.SamConstructor) + return symbolsCache.cache(firSymbol) { KtFirFunctionSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildFunctionSignature(fir: FirSimpleFunction): KtFunctionLikeSignature { - fir.symbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) - val functionSymbol = buildFunctionSymbol(fir) + fun buildFunctionSignature(firSymbol: FirNamedFunctionSymbol): KtFunctionLikeSignature { + firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + val functionSymbol = buildFunctionSymbol(firSymbol) return KtFunctionLikeSignature( functionSymbol, - typeBuilder.buildKtType(fir.returnTypeRef), - fir.receiverTypeRef?.let { typeBuilder.buildKtType(it) }, - functionSymbol.valueParameters.zip(fir.valueParameters).map { (ktSymbol, fir) -> + typeBuilder.buildKtType(firSymbol.resolvedReturnType), + firSymbol.resolvedReceiverTypeRef?.let { typeBuilder.buildKtType(it) }, + functionSymbol.valueParameters.zip(firSymbol.fir.valueParameters).map { (ktSymbol, fir) -> var type = fir.returnTypeRef.coneType if (fir.isVararg) { type = type.arrayElementType() ?: type @@ -246,114 +249,118 @@ internal class KtSymbolByFirBuilder private constructor( ) } - fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction): KtFirAnonymousFunctionSymbol { - return symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildAnonymousFunctionSymbol(firSymbol: FirAnonymousFunctionSymbol): KtFirAnonymousFunctionSymbol { + return symbolsCache.cache(firSymbol) { KtFirAnonymousFunctionSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildConstructorSymbol(fir: FirConstructor): KtFirConstructorSymbol { - val originalFir = fir.originalConstructorIfTypeAlias ?: fir - return symbolsCache.cache(originalFir) { - KtFirConstructorSymbol(originalFir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildConstructorSymbol(firSymbol: FirConstructorSymbol): KtFirConstructorSymbol { + val originalFirSymbol = firSymbol.fir.originalConstructorIfTypeAlias?.symbol ?: firSymbol + return symbolsCache.cache(originalFirSymbol) { + KtFirConstructorSymbol(originalFirSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildSamConstructorSymbol(fir: FirSimpleFunction): KtFirSamConstructorSymbol { - check(fir.origin == FirDeclarationOrigin.SamConstructor) - return symbolsCache.cache(fir) { KtFirSamConstructorSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildSamConstructorSymbol(firSymbol: FirNamedFunctionSymbol): KtFirSamConstructorSymbol { + check(firSymbol.origin == FirDeclarationOrigin.SamConstructor) + return symbolsCache.cache(firSymbol) { KtFirSamConstructorSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtFunctionLikeSymbol { - return symbolsCache.cache(fir) { - if (fir.isGetter) { - KtFirPropertyGetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildPropertyAccessorSymbol(firSymbol: FirPropertyAccessorSymbol): KtFunctionLikeSymbol { + return symbolsCache.cache(firSymbol) { + if (firSymbol.isGetter) { + KtFirPropertyGetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } else { - KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + KtFirPropertySetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } } } inner class VariableLikeSymbolBuilder { - fun buildVariableLikeSymbol(fir: FirVariable): KtVariableLikeSymbol { - return when (fir) { - is FirProperty -> buildVariableSymbol(fir) - is FirValueParameter -> buildValueParameterSymbol(fir) - is FirField -> buildFieldSymbol(fir) - is FirEnumEntry -> buildEnumEntrySymbol(fir) // TODO enum entry should not be callable - is FirBackingField -> buildBackingFieldSymbol(fir) + fun buildVariableLikeSymbol(firSymbol: FirVariableSymbol<*>): KtVariableLikeSymbol { + return when (firSymbol) { + is FirPropertySymbol -> buildVariableSymbol(firSymbol) + is FirValueParameterSymbol -> buildValueParameterSymbol(firSymbol) + is FirFieldSymbol -> buildFieldSymbol(firSymbol) + is FirEnumEntrySymbol -> buildEnumEntrySymbol(firSymbol) // TODO enum entry should not be callable + is FirBackingFieldSymbol -> buildBackingFieldSymbol(firSymbol) - is FirErrorProperty -> throwUnexpectedElementError(fir) + is FirErrorPropertySymbol -> throwUnexpectedElementError(firSymbol) + is FirDelegateFieldSymbol -> throwUnexpectedElementError(firSymbol) } } - fun buildVariableLikeSignature(fir: FirVariable): KtVariableLikeSignature { - if (fir is FirProperty && !fir.isLocal && fir !is FirSyntheticProperty) return buildPropertySignature(fir) - return buildVariableLikeSymbol(fir).toSignature() + fun buildVariableLikeSignature(firSymbol: FirVariableSymbol<*>): KtVariableLikeSignature { + if (firSymbol is FirPropertySymbol && !firSymbol.isLocal && firSymbol !is FirSyntheticPropertySymbol) { + return buildPropertySignature(firSymbol) + } + return buildVariableLikeSymbol(firSymbol).toSignature() } - fun buildVariableSymbol(fir: FirProperty): KtVariableSymbol { + fun buildVariableSymbol(firSymbol: FirPropertySymbol): KtVariableSymbol { return when { - fir.isLocal -> buildLocalVariableSymbol(fir) - fir is FirSyntheticProperty -> buildSyntheticJavaPropertySymbol(fir) - else -> buildPropertySymbol(fir) + firSymbol.isLocal -> buildLocalVariableSymbol(firSymbol) + firSymbol is FirSyntheticPropertySymbol -> buildSyntheticJavaPropertySymbol(firSymbol) + else -> buildPropertySymbol(firSymbol) } } - fun buildPropertySymbol(fir: FirProperty): KtVariableSymbol { - checkRequirementForBuildingSymbol(fir, !fir.isLocal) - checkRequirementForBuildingSymbol(fir, fir !is FirSyntheticProperty) + fun buildPropertySymbol(firSymbol: FirPropertySymbol): KtVariableSymbol { + checkRequirementForBuildingSymbol(firSymbol, !firSymbol.isLocal) + checkRequirementForBuildingSymbol(firSymbol, firSymbol !is FirSyntheticPropertySymbol) + checkRequirementForBuildingSymbol(firSymbol, firSymbol !is FirSyntheticPropertySymbol) - fir.unwrapSubstitutionOverrideIfNeeded()?.let { - return buildVariableSymbol(it) + firSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let { + return buildVariableSymbol(it.symbol) } - return symbolsCache.cache(fir) { - KtFirKotlinPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + return symbolsCache.cache(firSymbol) { + KtFirKotlinPropertySymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildPropertySignature(fir: FirProperty): KtVariableLikeSignature { - fir.symbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + fun buildPropertySignature(firSymbol: FirPropertySymbol): KtVariableLikeSignature { + firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) return KtVariableLikeSignature( - buildPropertySymbol(fir), - typeBuilder.buildKtType(fir.returnTypeRef), - fir.receiverTypeRef?.let { typeBuilder.buildKtType(it) } + buildPropertySymbol(firSymbol), + typeBuilder.buildKtType(firSymbol.fir.returnTypeRef), + firSymbol.resolvedReceiverTypeRef?.let { typeBuilder.buildKtType(it) } ) } - fun buildLocalVariableSymbol(fir: FirProperty): KtFirLocalVariableSymbol { - checkRequirementForBuildingSymbol(fir, fir.isLocal) - return symbolsCache.cache(fir) { - KtFirLocalVariableSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildLocalVariableSymbol(firSymbol: FirPropertySymbol): KtFirLocalVariableSymbol { + checkRequirementForBuildingSymbol(firSymbol, firSymbol.isLocal) + return symbolsCache.cache(firSymbol) { + KtFirLocalVariableSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildSyntheticJavaPropertySymbol(fir: FirSyntheticProperty): KtFirSyntheticJavaPropertySymbol { - return symbolsCache.cache(fir) { - KtFirSyntheticJavaPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildSyntheticJavaPropertySymbol(firSymbol: FirSyntheticPropertySymbol): KtFirSyntheticJavaPropertySymbol { + return symbolsCache.cache(firSymbol) { + KtFirSyntheticJavaPropertySymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildValueParameterSymbol(fir: FirValueParameter): KtValueParameterSymbol { - return symbolsCache.cache(fir) { - KtFirValueParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildValueParameterSymbol(firSymbol: FirValueParameterSymbol): KtValueParameterSymbol { + return symbolsCache.cache(firSymbol) { + KtFirValueParameterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { - checkRequirementForBuildingSymbol(fir, fir.isJavaFieldOrSubstitutionOverrideOfJavaField()) - return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildFieldSymbol(firSymbol: FirFieldSymbol): KtFirJavaFieldSymbol { + checkRequirementForBuildingSymbol(firSymbol, firSymbol.fir.isJavaFieldOrSubstitutionOverrideOfJavaField()) + return symbolsCache.cache(firSymbol) { KtFirJavaFieldSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildBackingFieldSymbol(fir: FirBackingField): KtFirBackingFieldSymbol { - return backingFieldCache.cache(fir) { - KtFirBackingFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildBackingFieldSymbol(firSymbol: FirBackingFieldSymbol): KtFirBackingFieldSymbol { + return backingFieldCache.cache(firSymbol) { + KtFirBackingFieldSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildBackingFieldSymbolByProperty(fir: FirProperty): KtFirBackingFieldSymbol { - val backingFieldSymbol = fir.backingField + fun buildBackingFieldSymbolByProperty(firSymbol: FirPropertySymbol): KtFirBackingFieldSymbol { + val backingFieldSymbol = firSymbol.backingFieldSymbol ?: error("FirProperty backingField is null") return buildBackingFieldSymbol(backingFieldSymbol) } @@ -366,53 +373,53 @@ internal class KtSymbolByFirBuilder private constructor( } inner class CallableSymbolBuilder { - fun buildCallableSymbol(fir: FirCallableDeclaration): KtCallableSymbol { - return when (fir) { - is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) - is FirFunction -> functionLikeBuilder.buildFunctionLikeSymbol(fir) - is FirVariable -> variableLikeBuilder.buildVariableLikeSymbol(fir) - else -> throwUnexpectedElementError(fir) + fun buildCallableSymbol(firSymbol: FirCallableSymbol<*>): KtCallableSymbol { + return when (firSymbol) { + is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol) + is FirFunctionSymbol<*> -> functionLikeBuilder.buildFunctionLikeSymbol(firSymbol) + is FirVariableSymbol<*> -> variableLikeBuilder.buildVariableLikeSymbol(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildCallableSignature(fir: FirCallableDeclaration): KtSignature { - return when (fir) { - is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir).toSignature() - is FirFunction -> functionLikeBuilder.buildFunctionLikeSignature(fir) - is FirVariable -> variableLikeBuilder.buildVariableLikeSignature(fir) - else -> throwUnexpectedElementError(fir) + fun buildCallableSignature(firSymbol: FirCallableSymbol<*>): KtSignature { + return when (firSymbol) { + is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol).toSignature() + is FirFunctionSymbol<*> -> functionLikeBuilder.buildFunctionLikeSignature(firSymbol) + is FirVariableSymbol<*> -> variableLikeBuilder.buildVariableLikeSignature(firSymbol) + else -> throwUnexpectedElementError(firSymbol) } } - fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtPropertyAccessorSymbol { + fun buildPropertyAccessorSymbol(firSymbol: FirPropertyAccessorSymbol): KtPropertyAccessorSymbol { return when { - fir.isGetter -> buildGetterSymbol(fir) - else -> buildSetterSymbol(fir) + firSymbol.isGetter -> buildGetterSymbol(firSymbol) + else -> buildSetterSymbol(firSymbol) } } - fun buildGetterSymbol(fir: FirPropertyAccessor): KtFirPropertyGetterSymbol { - checkRequirementForBuildingSymbol(fir, fir.isGetter) - return symbolsCache.cache(fir) { KtFirPropertyGetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildGetterSymbol(firSymbol: FirPropertyAccessorSymbol): KtFirPropertyGetterSymbol { + checkRequirementForBuildingSymbol(firSymbol, firSymbol.isGetter) + return symbolsCache.cache(firSymbol) { KtFirPropertyGetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildSetterSymbol(fir: FirPropertyAccessor): KtFirPropertySetterSymbol { - checkRequirementForBuildingSymbol(fir, fir.isSetter) - return symbolsCache.cache(fir) { KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + fun buildSetterSymbol(firSymbol: FirPropertyAccessorSymbol): KtFirPropertySetterSymbol { + checkRequirementForBuildingSymbol(firSymbol, firSymbol.isSetter) + return symbolsCache.cache(firSymbol) { KtFirPropertySetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } - fun buildExtensionReceiverSymbol(fir: FirCallableDeclaration): KtReceiverParameterSymbol? { - if (fir.receiverTypeRef == null) return null - return extensionReceiverSymbolsCache.cache(fir) { - KtFirReceiverParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) + fun buildExtensionReceiverSymbol(firCallableSymbol: FirCallableSymbol<*>): KtReceiverParameterSymbol? { + if (firCallableSymbol.fir.receiverTypeRef == null) return null + return extensionReceiverSymbolsCache.cache(firCallableSymbol) { + KtFirReceiverParameterSymbol(firCallableSymbol, resolveState, token, this@KtSymbolByFirBuilder) } } } inner class AnonymousInitializerBuilder { - fun buildClassInitializer(fir: FirAnonymousInitializer): KtClassInitializerSymbol { - return symbolsCache.cache(fir) { KtFirClassInitializerSymbol(fir, resolveState, token) } + fun buildClassInitializer(firSymbol: FirAnonymousInitializerSymbol): KtClassInitializerSymbol { + return symbolsCache.cache(firSymbol) { KtFirClassInitializerSymbol(firSymbol, resolveState, token) } } } @@ -516,14 +523,14 @@ internal class KtSymbolByFirBuilder private constructor( @OptIn(ExperimentalContracts::class) private inline fun checkRequirementForBuildingSymbol( - fir: FirElement, + firSymbol: FirBasedSymbol<*>, requirement: Boolean, ) { contract { returns() implies requirement } require(requirement) { - "Cannot build ${S::class.simpleName} for ${fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}" + "Cannot build ${S::class.simpleName} for ${firSymbol.fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}" } } } @@ -551,10 +558,10 @@ private class BuilderCache private constructor( } internal fun FirElement.buildSymbol(builder: KtSymbolByFirBuilder) = - (this as? FirDeclaration)?.let(builder::buildSymbol) + (this as? FirDeclaration)?.symbol?.let(builder::buildSymbol) internal fun FirDeclaration.buildSymbol(builder: KtSymbolByFirBuilder) = - builder.buildSymbol(this) + builder.buildSymbol(symbol) private fun collectReferencedTypeParameters(declaration: FirCallableDeclaration): Set { val allUsedTypeParameters = mutableSetOf() diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForDeclaration.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForDeclaration.kt index cda6b5fafa5..8029c4fc4ff 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForDeclaration.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/annotations/KtFirAnnotationListForDeclaration.kt @@ -8,56 +8,52 @@ package org.jetbrains.kotlin.analysis.api.fir.annotations import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication -import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.name.ClassId internal class KtFirAnnotationListForDeclaration private constructor( - val firRef: FirRefWithValidityCheck<*>, + val firSymbol: FirBasedSymbol<*>, private val useSiteSession: FirSession, override val token: ValidityToken, ) : KtAnnotationsList() { override val annotations: List - get() = firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir -> - fir.annotations.map { annotation -> - annotation.toKtAnnotationApplication(useSiteSession) - } + get() = withValidityAssertion { + firSymbol.resolvedAnnotationsWithArguments + .map { annotation -> + annotation.toKtAnnotationApplication(useSiteSession) + } } - override fun containsAnnotation(classId: ClassId): Boolean { - return firRef.withFirByType(ResolveType.AnnotationType) { fir -> - fir.annotations.any { it.fullyExpandedClassId(useSiteSession) == classId } + override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion { + firSymbol.resolvedAnnotationClassIds.contains(classId) + } + + override fun annotationsByClassId(classId: ClassId): List = withValidityAssertion { + firSymbol.resolvedAnnotationsWithArguments.mapNotNull { annotation -> + if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null + annotation.toKtAnnotationApplication(useSiteSession) } } - override fun annotationsByClassId(classId: ClassId): List = - firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir -> - fir.annotations.mapNotNull { annotation -> - if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null - annotation.toKtAnnotationApplication(useSiteSession) - } - } override val annotationClassIds: Collection - get() = firRef.withFirByType(ResolveType.AnnotationType) { fir -> - fir.annotations.mapNotNull { it.fullyExpandedClassId(useSiteSession) } - } + get() = withValidityAssertion { firSymbol.resolvedAnnotationClassIds } companion object { fun create( - firRef: FirRefWithValidityCheck<*>, + firSymbol: FirBasedSymbol<*>, useSiteSession: FirSession, token: ValidityToken, ): KtAnnotationsList { - return if (firRef.withFir { it.annotations.isEmpty() }) { + return if (firSymbol.annotations.isEmpty()) { KtEmptyAnnotationsList(token) } else { - KtFirAnnotationListForDeclaration(firRef, useSiteSession, token) + KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token) } } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index ab29f4a85a1..20c07e98385 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -592,7 +592,7 @@ internal class KtFirCallResolver( if (psi == null) { val implicitPartiallyAppliedSymbol = when (val partiallyAppliedSymbol = calleeReference.boundSymbol) { is FirClassSymbol<*> -> partiallyAppliedSymbol.toKtSymbol() - is FirCallableSymbol<*> -> firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(partiallyAppliedSymbol.fir) + is FirCallableSymbol<*> -> firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(partiallyAppliedSymbol) ?: return null else -> return null } @@ -611,22 +611,22 @@ internal class KtFirCallResolver( @OptIn(SymbolInternals::class) private fun FirCallableSymbol<*>.toKtSignature(): KtSignature = - firSymbolBuilder.callableBuilder.buildCallableSignature(fir) + firSymbolBuilder.callableBuilder.buildCallableSignature(this) @OptIn(SymbolInternals::class) - private fun FirClassLikeSymbol<*>.toKtSymbol(): KtClassLikeSymbol = firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir) + private fun FirClassLikeSymbol<*>.toKtSymbol(): KtClassLikeSymbol = firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(this) @OptIn(SymbolInternals::class) private fun FirNamedFunctionSymbol.toKtSignature(): KtFunctionLikeSignature = - firSymbolBuilder.functionLikeBuilder.buildFunctionSignature(fir) + firSymbolBuilder.functionLikeBuilder.buildFunctionSignature(this) @OptIn(SymbolInternals::class) private fun FirVariableSymbol<*>.toKtSignature(): KtVariableLikeSignature = - firSymbolBuilder.variableLikeBuilder.buildVariableLikeSignature(fir) + firSymbolBuilder.variableLikeBuilder.buildVariableLikeSignature(this) @OptIn(SymbolInternals::class) private fun FirValueParameterSymbol.toKtSymbol(): KtValueParameterSymbol = - firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(fir) + firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(this) private fun FirArrayOfCall.toKtCallInfo(): KtCallInfo? { val arrayOfSymbol = with(analysisSession) { @@ -668,15 +668,15 @@ internal class KtFirCallResolver( } private fun FirArrayOfCall.createSubstitutorFromTypeArguments(arrayOfSymbol: KtFirFunctionSymbol): KtSubstitutor { - return arrayOfSymbol.firRef.withFir { - // No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments - val typeParameter = it.typeParameters.singleOrNull() ?: return@withFir null - val elementType = typeRef.coneTypeSafe()?.arrayElementType() ?: return@withFir null - val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession) - firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor) - } ?: KtSubstitutor.Empty(token) + val firSymbol = arrayOfSymbol.firSymbol + // No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments + val typeParameter = firSymbol.fir.typeParameters.singleOrNull() ?: return KtSubstitutor.Empty(token) + val elementType = typeRef.coneTypeSafe()?.arrayElementType() ?: return KtSubstitutor.Empty(token) + val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession) + return firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor) } + private fun FirEqualityOperatorCall.toKtCallInfo(psi: KtElement): KtCallInfo? { val binaryExpression = deparenthesize(psi as? KtExpression) as? KtBinaryExpression ?: return null val leftPsi = binaryExpression.left ?: return null @@ -748,9 +748,8 @@ internal class KtFirCallResolver( substitutor: KtSubstitutor, ): LinkedHashMap> { val ktArgumentMapping = LinkedHashMap>() - val parameterSymbol = arrayOfCallSymbol.firRef.withFir { - it.valueParameters.single().symbol.toKtSymbol() - } + val parameterSymbol = arrayOfCallSymbol.firSymbol.fir.valueParameters.single().symbol.toKtSymbol() + for (firExpression in argumentList.arguments) { mapArgumentExpressionToParameter(firExpression, parameterSymbol.toSignature(substitutor), ktArgumentMapping) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt index 3a15ee823d8..d09ff0399d3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCompletionCandidateChecker.kt @@ -26,8 +26,9 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue -import org.jetbrains.kotlin.fir.types.receiverType +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.receiverType import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -45,12 +46,10 @@ internal class KtFirCompletionCandidateChecker( possibleExplicitReceiver: KtExpression?, ): KtExtensionApplicabilityResult = withValidityAssertion { require(firSymbolForCandidate is KtFirSymbol<*>) - return firSymbolForCandidate.firRef.withFir( - phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE - ) { declaration -> - check(declaration is FirCallableDeclaration) - checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver) - } + firSymbolForCandidate.firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + val declaration = firSymbolForCandidate.firSymbol.fir as FirCallableDeclaration + checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver) + } private fun checkExtension( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionInfoProvider.kt index 14ac8934a93..f68d2e8ffcc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionInfoProvider.kt @@ -5,16 +5,16 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.diagnostics.WhenMissingCase -import org.jetbrains.kotlin.fir.expressions.FirReturnExpression -import org.jetbrains.kotlin.fir.expressions.FirWhenExpression -import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe import org.jetbrains.kotlin.analysis.api.components.KtExpressionInfoProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe +import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.fir.declarations.FirErrorFunction +import org.jetbrains.kotlin.fir.expressions.FirReturnExpression +import org.jetbrains.kotlin.fir.expressions.FirWhenExpression +import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer import org.jetbrains.kotlin.psi.KtReturnExpression import org.jetbrains.kotlin.psi.KtWhenExpression @@ -26,7 +26,7 @@ internal class KtFirExpressionInfoProvider( val fir = returnExpression.getOrBuildFirSafe(firResolveState) ?: return null val firTargetSymbol = fir.target.labeledElement if (firTargetSymbol is FirErrorFunction) return null - return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol) + return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol.symbol) } override fun getWhenMissingCases(whenExpression: KtWhenExpression): List { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt index 510b22c78f2..8c941b4b551 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirInheritorsProvider.kt @@ -5,8 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors import org.jetbrains.kotlin.analysis.api.components.KtInheritorsProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol @@ -15,6 +13,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors internal class KtFirInheritorsProvider( override val analysisSession: KtFirAnalysisSession, @@ -26,9 +26,7 @@ internal class KtFirInheritorsProvider( require(classSymbol.modality == Modality.SEALED) require(classSymbol is KtFirNamedClassOrObjectSymbol) - val inheritorClassIds = classSymbol.firRef.withFir { fir -> - fir.getSealedClassInheritors(analysisSession.rootModuleSession) - } + val inheritorClassIds = classSymbol.firSymbol.fir.getSealedClassInheritors(analysisSession.rootModuleSession) with(analysisSession) { inheritorClassIds.mapNotNull { it.getCorrespondingToplevelClassOrObjectSymbol() as? KtNamedClassOrObjectSymbol } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt index d4cecf80b1e..5d95ca2297e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt @@ -88,8 +88,8 @@ internal class KtFirReferenceShortener( context, towerContext, selection, - classShortenOption = { classShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it.fir) as KtClassLikeSymbol) }, - callableShortenOption = { callableShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it.fir) as KtCallableSymbol) }, + classShortenOption = { classShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it) as KtClassLikeSymbol) }, + callableShortenOption = { callableShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it) as KtCallableSymbol) }, firResolveState, ) firDeclaration.accept(collector) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSamResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSamResolver.kt index f223140967a..ea3f3f255f9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSamResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSamResolver.kt @@ -5,6 +5,12 @@ package org.jetbrains.kotlin.analysis.api.fir.components +import org.jetbrains.kotlin.analysis.api.components.KtSamResolver +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.getClassLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass @@ -13,12 +19,6 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer -import org.jetbrains.kotlin.analysis.api.components.KtSamResolver -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.getClassLikeSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken internal class KtFirSamResolver( override val analysisSession: KtFirAnalysisSession, @@ -30,7 +30,7 @@ internal class KtFirSamResolver( val owner = analysisSession.getClassLikeSymbol(classId) as? FirRegularClass ?: return null val resolver = LocalSamResolver(analysisSession.rootModuleSession) return resolver.getSamConstructor(owner)?.let { - analysisSession.firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(it) + analysisSession.firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(it.symbol) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt index f82128fe2b2..5ad47a586b2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirScopeProvider.kt @@ -7,18 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression -import org.jetbrains.kotlin.fir.resolve.ScopeSession -import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope -import org.jetbrains.kotlin.fir.resolve.scope -import org.jetbrains.kotlin.fir.scopes.* -import org.jetbrains.kotlin.fir.scopes.impl.* -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner import org.jetbrains.kotlin.analysis.api.components.KtImplicitReceiver import org.jetbrains.kotlin.analysis.api.components.KtScopeContext @@ -26,19 +14,35 @@ import org.jetbrains.kotlin.analysis.api.components.KtScopeProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.scopes.* -import org.jetbrains.kotlin.analysis.api.fir.symbols.* +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirAnonymousObjectSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirEnumEntrySymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef -import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeScope -import org.jetbrains.kotlin.analysis.api.scopes.* +import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope +import org.jetbrains.kotlin.analysis.api.scopes.KtScope import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.utils.delegateFields +import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope +import org.jetbrains.kotlin.fir.resolve.scope +import org.jetbrains.kotlin.fir.scopes.* +import org.jetbrains.kotlin.fir.scopes.impl.* +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile import java.util.* @@ -60,15 +64,24 @@ internal class KtFirScopeProvider( private val fileScopeCache = IdentityHashMap() private val packageMemberScopeCache = IdentityHashMap() - private inline fun KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass) -> T): T? = when (this) { - is KtFirNamedClassOrObjectSymbol -> firRef.withFir(FirResolvePhase.TYPES, body) - is KtFirAnonymousObjectSymbol -> firRef.withFir(FirResolvePhase.TYPES, body) - is KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { - val initializer = it.initializer - check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" } - body(initializer.anonymousObject) + private inline fun KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass) -> T): T? { + when (this) { + is KtFirNamedClassOrObjectSymbol -> { + firSymbol.ensureResolved(FirResolvePhase.TYPES) + return body(firSymbol.fir) + } + is KtFirAnonymousObjectSymbol -> { + firSymbol.ensureResolved(FirResolvePhase.TYPES) + return body(firSymbol.fir) + } + is KtFirEnumEntrySymbol -> { + firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + val initializer = firSymbol.fir.initializer + check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" } + return body(initializer.anonymousObject) + } + else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" } } - else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" } } override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index d94c9691aca..bba36a43fb2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -19,13 +19,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.psi -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtDestructuringDeclaration -import org.jetbrains.kotlin.psi.KtFunctionLiteral -import org.jetbrains.kotlin.psi.KtPrimaryConstructor -import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.psi.* internal class KtFirSymbolContainingDeclarationProvider( override val analysisSession: KtFirAnalysisSession, @@ -35,10 +30,9 @@ internal class KtFirSymbolContainingDeclarationProvider( assertIsValidAndAccessible() if (symbol is KtReceiverParameterSymbol) { - return (symbol as KtFirReceiverParameterSymbol).firRef.withFir { - firSymbolBuilder.buildSymbol(it) as KtSymbolWithKind - } + return firSymbolBuilder.buildSymbol((symbol as KtFirReceiverParameterSymbol).firSymbol) as KtSymbolWithKind } + if (symbol is KtPackageSymbol) return null if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null if (symbol is KtCallableSymbol) { @@ -51,11 +45,10 @@ internal class KtFirSymbolContainingDeclarationProvider( } return when (symbol) { is KtFirTypeParameterSymbol -> { - symbol.firRef.withFir { fir -> - fir.containingDeclarationSymbol?.fir?.let { containingDeclaration -> - firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind - } + symbol.firSymbol.containingDeclarationSymbol?.let { containingDeclaration -> + firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind } + } is KtSymbolWithKind -> when (symbol.origin) { KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED -> @@ -90,7 +83,7 @@ internal class KtFirSymbolContainingDeclarationProvider( } private fun getContainingPsi(symbol: KtFirSymbol<*>): KtDeclaration { - val source = symbol.firRef.withFir(action = FirDeclaration::source) + val source = symbol.firSymbol.source val thisSource = when (source?.kind) { null -> error("PSI should present for declaration built by Kotlin code") KtFakeSourceElementKind.ImplicitConstructor -> diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index ba3184dd381..1832a00cc75 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -16,7 +16,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes @@ -25,6 +24,7 @@ import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverrideFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymbol @@ -43,7 +43,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) } } override fun getDirectlyOverriddenSymbols(callableSymbol: T): List { @@ -54,7 +54,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) } } private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) { @@ -109,21 +109,21 @@ internal class KtFirSymbolDeclarationOverridesProvider( } private inline fun processOverrides( - containingDeclaration: KtFirSymbol, + containingDeclaration: KtFirSymbol>, callableSymbol: KtFirSymbol<*>, crossinline process: (FirTypeScope, FirDeclaration) -> Unit ) { - containingDeclaration.firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { firContainer -> - callableSymbol.firRef.withFirUnsafe { firCallableDeclaration -> - val firTypeScope = firContainer.unsubstitutedScope( - firContainer.moduleData.session, - ScopeSession(), - withForcedTypeCalculator = false - ) - firTypeScope.processCallableByName(firCallableDeclaration) - process(firTypeScope, firCallableDeclaration) - } - } + containingDeclaration.firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + val firContainer = containingDeclaration.firSymbol.fir + val firCallableDeclaration = callableSymbol.firSymbol.fir + + val firTypeScope = firContainer.unsubstitutedScope( + firContainer.moduleData.session, + ScopeSession(), + withForcedTypeCalculator = false + ) + firTypeScope.processCallableByName(firCallableDeclaration) + process(firTypeScope, firCallableDeclaration) } private fun FirCallableSymbol<*>.collectIntersectionOverridesSymbolsTo(to: MutableCollection>) { @@ -153,13 +153,14 @@ internal class KtFirSymbolDeclarationOverridesProvider( require(superClass is KtFirSymbol<*>) if (subClass == superClass) return false - return subClass.firRef.withFirByType(ResolveType.ClassSuperTypes) { subClassFir -> - check(subClassFir is FirClass) - superClass.firRef.withFir { superClassFir -> - check(superClassFir is FirClass) - isSubClassOf(subClassFir, superClassFir, checkDeep) - } - } + subClass.firSymbol.ensureResolved(FirResolvePhase.SUPER_TYPES) + return isSubClassOf( + subClass = subClass.firSymbol.fir as FirClass, + superClass = superClass.firSymbol.fir as FirClass, + checkDeep + ) + + } private fun isSubClassOf(subClass: FirClass, superClass: FirClass, checkDeep: Boolean): Boolean { @@ -176,11 +177,10 @@ internal class KtFirSymbolDeclarationOverridesProvider( override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection { require(symbol is KtFirSymbol<*>) if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList() - return symbol.firRef.withFir { fir -> - val firSymbol = fir.symbol - firSymbol.getIntersectionOverriddenSymbols() - .map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } - } + return symbol.firSymbol + .getIntersectionOverriddenSymbols() + .map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) } + } private fun FirBasedSymbol<*>.getIntersectionOverriddenSymbols(): Collection> { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt index eb970e1d774..1c59159bf97 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolDeclarationRendererProvider.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.symbols.ensureResolved internal class KtFirSymbolDeclarationRendererProvider( override val analysisSession: KtFirAnalysisSession, @@ -30,8 +31,7 @@ internal class KtFirSymbolDeclarationRendererProvider( override fun renderDeclaration(symbol: KtDeclarationSymbol, options: KtDeclarationRendererOptions): String { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir(FirResolvePhase.BODY_RESOLVE) { fir -> - FirIdeRenderer.render(fir, options, fir.moduleData.session) - } + symbol.firSymbol.ensureResolved(FirResolvePhase.BODY_RESOLVE) + return FirIdeRenderer.render(symbol.firSymbol.fir, options, symbol.firSymbol.fir.moduleData.session) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt index bcbb2ea12f2..f411c126fd2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolInfoProvider.kt @@ -5,12 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components -import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite -import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation -import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol @@ -20,8 +14,14 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertyS import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite +import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo internal class KtFirSymbolInfoProvider( override val analysisSession: KtFirAnalysisSession, @@ -30,48 +30,45 @@ internal class KtFirSymbolInfoProvider( override fun getDeprecation(symbol: KtSymbol): DeprecationInfo? { if (symbol is KtFirBackingFieldSymbol || symbol is KtFirPackageSymbol) return null require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir { - val firSymbol = it.symbol - if (firSymbol is FirPropertySymbol) { + return when (val firSymbol = symbol.firSymbol) { + is FirPropertySymbol -> { firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY) - } else { + } + else -> { firSymbol.getDeprecationForCallSite() } } + } override fun getDeprecation(symbol: KtSymbol, annotationUseSiteTarget: AnnotationUseSiteTarget?): DeprecationInfo? { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir { firDeclaration -> - if (annotationUseSiteTarget != null) { - firDeclaration.symbol.getDeprecationForCallSite(annotationUseSiteTarget) - } else { - firDeclaration.symbol.getDeprecationForCallSite() - } + return if (annotationUseSiteTarget != null) { + symbol.firSymbol.getDeprecationForCallSite(annotationUseSiteTarget) + } else { + symbol.firSymbol.getDeprecationForCallSite() } + } override fun getGetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir { - it.symbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY) - } + return symbol.firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY) + } override fun getSetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir { - it.symbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY) - } + return symbol.firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY) } override fun getJavaGetterName(symbol: KtPropertySymbol): Name { require(symbol is KtFirSymbol<*>) if (symbol is KtFirSyntheticJavaPropertySymbol) { - return symbol.firRef.withFir { it.getter.delegate.name } + return symbol.javaGetterSymbol.name } - val jvmName = symbol.firRef.withFir { - val firProperty = it as? FirProperty ?: return@withFir null + val jvmName = run { + val firProperty = symbol.firSymbol.fir as? FirProperty ?: return@run null firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER) ?: firProperty.getter?.getJvmNameFromAnnotation() } return Name.identifier(jvmName ?: JvmAbi.getterName(symbol.name.identifier)) @@ -80,13 +77,13 @@ internal class KtFirSymbolInfoProvider( override fun getJavaSetterName(symbol: KtPropertySymbol): Name? { require(symbol is KtFirSymbol<*>) if (symbol is KtFirSyntheticJavaPropertySymbol) { - symbol.firRef.withFir { it.setter?.delegate?.name } + return symbol.javaSetterSymbol?.name } return if (symbol.isVal) null else { - val jvmName = symbol.firRef.withFir { - val firProperty = it as? FirProperty ?: return@withFir null - firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_SETTER) + val jvmName = run { + val firProperty = symbol.firSymbol.fir as? FirProperty ?: return@run null + firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER) ?: firProperty.setter?.getJvmNameFromAnnotation() } Name.identifier(jvmName ?: JvmAbi.setterName(symbol.name.identifier)) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt index 92cd295facf..070fcd66cb3 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeCreator.kt @@ -10,15 +10,16 @@ import org.jetbrains.kotlin.analysis.api.components.KtTypeCreator import org.jetbrains.kotlin.analysis.api.components.KtTypeParameterTypeBuilder import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtClassType import org.jetbrains.kotlin.analysis.api.types.KtTypeParameterType import org.jetbrains.kotlin.analysis.api.withValidityAssertion -import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.impl.toConeType +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassLikeType import org.jetbrains.kotlin.fir.types.typeContext @@ -38,7 +39,7 @@ internal class KtFirTypeCreator( is KtClassTypeBuilder.BySymbol -> { val symbol = builder.symbol check(symbol is KtFirSymbol<*>) - symbol.firRef.withFir { (it as FirClassLikeDeclaration).symbol.toLookupTag() } + (symbol.firSymbol as FirClassLikeSymbol<*>).toLookupTag() } } @@ -56,8 +57,7 @@ internal class KtFirTypeCreator( val coneType = when (builder) { is KtTypeParameterTypeBuilder.BySymbol -> { val symbol = builder.symbol - check(symbol is KtFirSymbol<*>) - symbol.firRef.withFir { (it as FirTypeParameter).toConeType() } + (symbol as KtFirTypeParameterSymbol).firSymbol.toConeType() } } return coneType.asKtType() as KtTypeParameterType diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt index 79642a63282..eadf98c0704 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirTypeProvider.kt @@ -10,12 +10,12 @@ import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.dispatchReceiverType import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator import org.jetbrains.kotlin.analysis.api.fir.utils.toConeNullability import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability @@ -37,10 +37,8 @@ import org.jetbrains.kotlin.fir.expressions.FirGetClassCall import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.toSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl @@ -72,13 +70,14 @@ internal class KtFirTypeProvider( override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType { require(symbol is KtFirNamedClassOrObjectSymbol) - val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass -> - ConeClassLikeTypeImpl( - firClass.symbol.toLookupTag(), - firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), isNullable = false) }.toTypedArray(), - isNullable = false - ) - } + symbol.firSymbol.ensureResolved(FirResolvePhase.SUPER_TYPES) + val firClass = symbol.firSymbol.fir + val type = ConeClassLikeTypeImpl( + firClass.symbol.toLookupTag(), + firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), isNullable = false) }.toTypedArray(), + isNullable = false + ) + return type.asKtType() } @@ -190,14 +189,11 @@ internal class KtFirTypeProvider( override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? { require(symbol is KtFirSymbol<*>) - - return symbol.firRef.withFir { declaration -> - check(declaration is FirCallableDeclaration) { - "Fir declaration should be FirCallableDeclaration; instead it was ${declaration::class}" - } - - declaration.dispatchReceiverType?.asKtType() + val firSymbol = symbol.firSymbol + check(firSymbol is FirCallableSymbol<*>) { + "Fir declaration should be FirCallableDeclaration; instead it was ${firSymbol::class}" } + return firSymbol.dispatchReceiverType(analysisSession.firSymbolBuilder) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt index fc1e33cf7a6..626c3d24a4a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirVisibilityChecker.kt @@ -6,13 +6,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue -import org.jetbrains.kotlin.fir.visibilityChecker -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol @@ -21,6 +14,13 @@ import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue +import org.jetbrains.kotlin.fir.visibilityChecker import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtNamedFunction @@ -42,32 +42,26 @@ internal class KtFirVisibilityChecker( require(useSiteFile is KtFirFileSymbol) val nonLocalContainingDeclaration = findContainingNonLocalDeclaration(position) + val useSiteFirFile = useSiteFile.firSymbol.fir + val containers = nonLocalContainingDeclaration + ?.getOrBuildFirSafe(analysisSession.firResolveState) + ?.collectDesignation() + ?.path + .orEmpty() - return useSiteFile.firRef.withFir { useSiteFirFile -> - val containers = nonLocalContainingDeclaration - ?.getOrBuildFirSafe(analysisSession.firResolveState) - ?.collectDesignation() - ?.path - .orEmpty() + val explicitDispatchReceiver = receiverExpression + ?.getOrBuildFirSafe(analysisSession.firResolveState) + ?.let { ExpressionReceiverValue(it) } - val explicitDispatchReceiver = receiverExpression - ?.getOrBuildFirSafe(analysisSession.firResolveState) - ?.let { ExpressionReceiverValue(it) } + val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration - candidateSymbol.firRef.withFir { candidateFirSymbol -> - require(candidateFirSymbol is FirMemberDeclaration) { - "$candidateFirSymbol must be a FirStatusOwner and FirSymbolOwner; it were ${candidateFirSymbol::class} instead" - } - - rootModuleSession.visibilityChecker.isVisible( - candidateFirSymbol, - rootModuleSession, - useSiteFirFile, - containers, - explicitDispatchReceiver - ) - } - } + return rootModuleSession.visibilityChecker.isVisible( + candidateFirSymbol, + rootModuleSession, + useSiteFirFile, + containers, + explicitDispatchReceiver + ) } private fun findContainingNonLocalDeclaration(element: PsiElement): KtCallableDeclaration? { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index d37e934e2fc..23b18113e6c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -250,7 +250,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INVISIBLE_SETTER) { firDiagnostic -> InvisibleSetterImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, @@ -259,7 +259,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INVISIBLE_REFERENCE) { firDiagnostic -> InvisibleReferenceImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -303,7 +303,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.DEPRECATION_ERROR) { firDiagnostic -> DeprecationErrorImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -311,7 +311,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.DEPRECATION) { firDiagnostic -> DeprecationImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -320,7 +320,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.UNRESOLVED_REFERENCE_WRONG_RECEIVER) { firDiagnostic -> UnresolvedReferenceWrongReceiverImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -369,7 +369,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.RESOLUTION_TO_CLASSIFIER) { firDiagnostic -> ResolutionToClassifierImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -438,7 +438,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE) { firDiagnostic -> QualifiedSupertypeExtendedByOtherSupertypeImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -463,7 +463,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.CLASS_CANNOT_BE_EXTENDED_DIRECTLY) { firDiagnostic -> ClassCannotBeExtendedDirectlyImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -564,8 +564,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INCONSISTENT_TYPE_PARAMETER_VALUES) { firDiagnostic -> InconsistentTypeParameterValuesImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic.c.map { coneKotlinType -> firSymbolBuilder.typeBuilder.buildKtType(coneKotlinType) }, @@ -575,8 +575,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INCONSISTENT_TYPE_PARAMETER_BOUNDS) { firDiagnostic -> InconsistentTypeParameterBoundsImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic.c.map { coneKotlinType -> firSymbolBuilder.typeBuilder.buildKtType(coneKotlinType) }, @@ -837,7 +837,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.OVERRIDE_DEPRECATION) { firDiagnostic -> OverrideDeprecationImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -1055,7 +1055,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE) { firDiagnostic -> ExposedTypealiasExpandedTypeImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1064,7 +1064,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_FUNCTION_RETURN_TYPE) { firDiagnostic -> ExposedFunctionReturnTypeImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1073,7 +1073,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_RECEIVER_TYPE) { firDiagnostic -> ExposedReceiverTypeImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1082,7 +1082,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_PROPERTY_TYPE) { firDiagnostic -> ExposedPropertyTypeImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1091,7 +1091,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR.errorFactory) { firDiagnostic -> ExposedPropertyTypeInConstructorErrorImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1100,7 +1100,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_PROPERTY_TYPE_IN_CONSTRUCTOR.warningFactory) { firDiagnostic -> ExposedPropertyTypeInConstructorWarningImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1109,7 +1109,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_PARAMETER_TYPE) { firDiagnostic -> ExposedParameterTypeImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1118,7 +1118,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_SUPER_INTERFACE) { firDiagnostic -> ExposedSuperInterfaceImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1127,7 +1127,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_SUPER_CLASS) { firDiagnostic -> ExposedSuperClassImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1136,7 +1136,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.EXPOSED_TYPE_PARAMETER_BOUND) { firDiagnostic -> ExposedTypeParameterBoundImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -1219,7 +1219,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.OPERATOR_MODIFIER_REQUIRED) { firDiagnostic -> OperatorModifierRequiredImpl( - firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a.fir), + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -1227,7 +1227,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INFIX_MODIFIER_REQUIRED) { firDiagnostic -> InfixModifierRequiredImpl( - firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a.fir), + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1380,7 +1380,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.NONE_APPLICABLE) { firDiagnostic -> NoneApplicableImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1388,7 +1388,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INAPPLICABLE_CANDIDATE) { firDiagnostic -> InapplicableCandidateImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1467,14 +1467,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.TOO_MANY_ARGUMENTS) { firDiagnostic -> TooManyArgumentsImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NO_VALUE_FOR_PARAMETER) { firDiagnostic -> NoValueForParameterImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1570,7 +1570,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY) { firDiagnostic -> OverloadResolutionAmbiguityImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1579,7 +1579,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.ASSIGN_OPERATOR_AMBIGUITY) { firDiagnostic -> AssignOperatorAmbiguityImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1588,7 +1588,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.ITERATOR_AMBIGUITY) { firDiagnostic -> IteratorAmbiguityImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1597,7 +1597,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.HAS_NEXT_FUNCTION_AMBIGUITY) { firDiagnostic -> HasNextFunctionAmbiguityImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1606,7 +1606,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.NEXT_AMBIGUITY) { firDiagnostic -> NextAmbiguityImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -1655,7 +1655,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS) { firDiagnostic -> WrongNumberOfTypeArgumentsImpl( firDiagnostic.a, - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1663,14 +1663,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.NO_TYPE_ARGUMENTS_ON_RHS) { firDiagnostic -> NoTypeArgumentsOnRhsImpl( firDiagnostic.a, - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.OUTER_CLASS_ARGUMENTS_REQUIRED) { firDiagnostic -> OuterClassArgumentsRequiredImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir as FirClass), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1758,28 +1758,28 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.KCLASS_WITH_NULLABLE_TYPE_PARAMETER_IN_SIGNATURE) { firDiagnostic -> KclassWithNullableTypeParameterInSignatureImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.TYPE_PARAMETER_AS_REIFIED) { firDiagnostic -> TypeParameterAsReifiedImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY.errorFactory) { firDiagnostic -> TypeParameterAsReifiedArrayErrorImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.TYPE_PARAMETER_AS_REIFIED_ARRAY.warningFactory) { firDiagnostic -> TypeParameterAsReifiedArrayWarningImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1824,7 +1824,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.CONFLICTING_UPPER_BOUNDS) { firDiagnostic -> ConflictingUpperBoundsImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1832,7 +1832,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER) { firDiagnostic -> NameInConstraintIsNotATypeParameterImpl( firDiagnostic.a, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1913,7 +1913,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.TYPE_VARIANCE_CONFLICT) { firDiagnostic -> TypeVarianceConflictImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic.c, firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.d), @@ -1923,7 +1923,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE) { firDiagnostic -> TypeVarianceConflictInExpandedTypeImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic.c, firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.d), @@ -1956,7 +1956,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.EXTENSION_IN_CLASS_REFERENCE_NOT_ALLOWED) { firDiagnostic -> ExtensionInClassReferenceNotAllowedImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -1994,23 +1994,23 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.NOTHING_TO_OVERRIDE) { firDiagnostic -> NothingToOverrideImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.CANNOT_OVERRIDE_INVISIBLE_MEMBER) { firDiagnostic -> CannotOverrideInvisibleMemberImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.DATA_CLASS_OVERRIDE_CONFLICT) { firDiagnostic -> DataClassOverrideConflictImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2018,7 +2018,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE) { firDiagnostic -> CannotWeakenAccessPrivilegeImpl( firDiagnostic.a, - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -2027,7 +2027,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE) { firDiagnostic -> CannotChangeAccessPrivilegeImpl( firDiagnostic.a, - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, token, @@ -2035,7 +2035,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic -> OverridingFinalMemberImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -2043,48 +2043,48 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.RETURN_TYPE_MISMATCH_ON_INHERITANCE) { firDiagnostic -> ReturnTypeMismatchOnInheritanceImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROPERTY_TYPE_MISMATCH_ON_INHERITANCE) { firDiagnostic -> PropertyTypeMismatchOnInheritanceImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAR_TYPE_MISMATCH_ON_INHERITANCE) { firDiagnostic -> VarTypeMismatchOnInheritanceImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.RETURN_TYPE_MISMATCH_BY_DELEGATION) { firDiagnostic -> ReturnTypeMismatchByDelegationImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROPERTY_TYPE_MISMATCH_BY_DELEGATION) { firDiagnostic -> PropertyTypeMismatchByDelegationImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION) { firDiagnostic -> VarOverriddenByValByDelegationImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2092,7 +2092,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CONFLICTING_INHERITED_MEMBERS) { firDiagnostic -> ConflictingInheritedMembersImpl( firDiagnostic.a.map { firCallableSymbol -> - firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol.fir) + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2100,32 +2100,32 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ABSTRACT_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> AbstractMemberNotImplementedImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> AbstractClassMemberNotImplementedImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER.errorFactory) { firDiagnostic -> InvisibleAbstractMemberFromSuperErrorImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER.warningFactory) { firDiagnostic -> InvisibleAbstractMemberFromSuperWarningImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2141,64 +2141,64 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.MANY_IMPL_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> ManyImplMemberNotImplementedImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED) { firDiagnostic -> ManyInterfacesMemberNotImplementedImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.OVERRIDING_FINAL_MEMBER_BY_DELEGATION) { firDiagnostic -> OverridingFinalMemberByDelegationImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.DELEGATED_MEMBER_HIDES_SUPERTYPE_OVERRIDE) { firDiagnostic -> DelegatedMemberHidesSupertypeOverrideImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.RETURN_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic -> ReturnTypeMismatchOnOverrideImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROPERTY_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic -> PropertyTypeMismatchOnOverrideImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAR_TYPE_MISMATCH_ON_OVERRIDE) { firDiagnostic -> VarTypeMismatchOnOverrideImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAR_OVERRIDDEN_BY_VAL) { firDiagnostic -> VarOverriddenByValImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2217,8 +2217,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.VIRTUAL_MEMBER_HIDDEN) { firDiagnostic -> VirtualMemberHiddenImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2232,7 +2232,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CONFLICTING_OVERLOADS) { firDiagnostic -> ConflictingOverloadsImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2241,7 +2241,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.REDECLARATION) { firDiagnostic -> RedeclarationImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2250,7 +2250,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.PACKAGE_OR_CLASSIFIER_REDECLARATION) { firDiagnostic -> PackageOrClassifierRedeclarationImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2278,36 +2278,36 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS) { firDiagnostic -> AbstractFunctionInNonAbstractClassImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.ABSTRACT_FUNCTION_WITH_BODY) { firDiagnostic -> AbstractFunctionWithBodyImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY) { firDiagnostic -> NonAbstractFunctionWithNoBodyImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PRIVATE_FUNCTION_WITH_NO_BODY) { firDiagnostic -> PrivateFunctionWithNoBodyImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NON_MEMBER_FUNCTION_NO_BODY) { firDiagnostic -> NonMemberFunctionNoBodyImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2423,8 +2423,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS) { firDiagnostic -> AbstractPropertyInNonAbstractClassImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2584,14 +2584,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER.errorFactory) { firDiagnostic -> DelegateUsesExtensionPropertyTypeParameterErrorImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.DELEGATE_USES_EXTENSION_PROPERTY_TYPE_PARAMETER.warningFactory) { firDiagnostic -> DelegateUsesExtensionPropertyTypeParameterWarningImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2825,7 +2825,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE) { firDiagnostic -> ActualAnnotationConflictingDefaultArgumentValueImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -2838,13 +2838,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.NO_ACTUAL_FOR_EXPECT) { firDiagnostic -> NoActualForExpectImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic.c.mapKeys { (incompatible, _) -> incompatible }.mapValues { (_, collection) -> collection.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) } }, firDiagnostic as KtPsiDiagnostic, @@ -2853,12 +2853,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ACTUAL_WITHOUT_EXPECT) { firDiagnostic -> ActualWithoutExpectImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b.mapKeys { (incompatible, _) -> incompatible }.mapValues { (_, collection) -> collection.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) } }, firDiagnostic as KtPsiDiagnostic, @@ -2867,9 +2867,9 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.AMBIGUOUS_ACTUALS) { firDiagnostic -> AmbiguousActualsImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2877,7 +2877,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.AMBIGUOUS_EXPECTS) { firDiagnostic -> AmbiguousExpectsImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b.map { firModuleData -> firModuleData }, @@ -2887,13 +2887,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS) { firDiagnostic -> NoActualClassMemberForExpectedClassImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b.map { pair -> - firSymbolBuilder.buildSymbol(pair.first.fir) to pair.second.mapKeys { (incompatible, _) -> + firSymbolBuilder.buildSymbol(pair.first) to pair.second.mapKeys { (incompatible, _) -> incompatible }.mapValues { (_, collection) -> collection.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) } } }, @@ -2925,7 +2925,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert ComponentFunctionAmbiguityImpl( firDiagnostic.a, firDiagnostic.b.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -2949,77 +2949,77 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.UNINITIALIZED_VARIABLE) { firDiagnostic -> UninitializedVariableImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.UNINITIALIZED_PARAMETER) { firDiagnostic -> UninitializedParameterImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.UNINITIALIZED_ENUM_ENTRY) { firDiagnostic -> UninitializedEnumEntryImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.UNINITIALIZED_ENUM_COMPANION) { firDiagnostic -> UninitializedEnumCompanionImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAL_REASSIGNMENT) { firDiagnostic -> ValReassignmentImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAL_REASSIGNMENT_VIA_BACKING_FIELD.errorFactory) { firDiagnostic -> ValReassignmentViaBackingFieldErrorImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir.propertySymbol.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir.propertySymbol), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.VAL_REASSIGNMENT_VIA_BACKING_FIELD.warningFactory) { firDiagnostic -> ValReassignmentViaBackingFieldWarningImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir.propertySymbol.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir.propertySymbol), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.CAPTURED_VAL_INITIALIZATION) { firDiagnostic -> CapturedValInitializationImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.CAPTURED_MEMBER_VAL_INITIALIZATION) { firDiagnostic -> CapturedMemberValInitializationImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.SETTER_PROJECTED_OUT) { firDiagnostic -> SetterProjectedOutImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.WRONG_INVOCATION_KIND) { firDiagnostic -> WrongInvocationKindImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic.c, firDiagnostic as KtPsiDiagnostic, @@ -3028,7 +3028,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.LEAKED_IN_PLACE_LAMBDA) { firDiagnostic -> LeakedInPlaceLambdaImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3047,7 +3047,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.INITIALIZATION_BEFORE_DECLARATION) { firDiagnostic -> InitializationBeforeDeclarationImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3284,21 +3284,21 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.TYPE_PARAMETER_IS_NOT_AN_EXPRESSION) { firDiagnostic -> TypeParameterIsNotAnExpressionImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.TYPE_PARAMETER_ON_LHS_OF_DOT) { firDiagnostic -> TypeParameterOnLhsOfDotImpl( - firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NO_COMPANION_OBJECT) { firDiagnostic -> NoCompanionObjectImpl( - firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3349,7 +3349,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.HAS_NEXT_FUNCTION_NONE_APPLICABLE) { firDiagnostic -> HasNextFunctionNoneApplicableImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -3358,7 +3358,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.NEXT_NONE_APPLICABLE) { firDiagnostic -> NextNoneApplicableImpl( firDiagnostic.a.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -3377,7 +3377,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert DelegateSpecialFunctionAmbiguityImpl( firDiagnostic.a, firDiagnostic.b.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -3387,7 +3387,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert DelegateSpecialFunctionNoneApplicableImpl( firDiagnostic.a, firDiagnostic.b.map { firBasedSymbol -> - firSymbolBuilder.buildSymbol(firBasedSymbol.fir) + firSymbolBuilder.buildSymbol(firBasedSymbol) }, firDiagnostic as KtPsiDiagnostic, token, @@ -3468,7 +3468,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT) { firDiagnostic -> AssignmentOperatorShouldReturnUnitImpl( - firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a.fir), + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a), firDiagnostic.b, firDiagnostic as KtPsiDiagnostic, token, @@ -3476,14 +3476,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.PROPERTY_AS_OPERATOR) { firDiagnostic -> PropertyAsOperatorImpl( - firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.DSL_SCOPE_VIOLATION) { firDiagnostic -> DslScopeViolationImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3635,14 +3635,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.USAGE_IS_NOT_INLINABLE) { firDiagnostic -> UsageIsNotInlinableImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NON_LOCAL_RETURN_NOT_ALLOWED) { firDiagnostic -> NonLocalReturnNotAllowedImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3662,62 +3662,62 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.NULLABLE_INLINE_PARAMETER) { firDiagnostic -> NullableInlineParameterImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.RECURSION_IN_INLINE) { firDiagnostic -> RecursionInInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.NON_PUBLIC_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> NonPublicCallFromPublicInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROTECTED_CONSTRUCTOR_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> ProtectedConstructorCallFromPublicInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE_ERROR) { firDiagnostic -> ProtectedCallFromPublicInlineErrorImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PROTECTED_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> ProtectedCallFromPublicInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.PRIVATE_CLASS_MEMBER_FROM_INLINE) { firDiagnostic -> PrivateClassMemberFromInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.SUPER_CALL_FROM_PUBLIC_INLINE) { firDiagnostic -> SuperCallFromPublicInlineImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3743,7 +3743,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.INVALID_DEFAULT_FUNCTIONAL_PARAMETER_FOR_INLINE) { firDiagnostic -> InvalidDefaultFunctionalParameterForInlineImpl( firDiagnostic.a.source!!.psi as KtExpression, - firSymbolBuilder.buildSymbol(firDiagnostic.b.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.b), firDiagnostic as KtPsiDiagnostic, token, ) @@ -3813,14 +3813,14 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ILLEGAL_SUSPEND_FUNCTION_CALL) { firDiagnostic -> IllegalSuspendFunctionCallImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.ILLEGAL_SUSPEND_PROPERTY_ACCESS) { firDiagnostic -> IllegalSuspendPropertyAccessImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a.fir), + firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) @@ -4299,7 +4299,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirJvmErrors.SUSPENSION_POINT_INSIDE_CRITICAL_SECTION) { firDiagnostic -> SuspensionPointInsideCriticalSectionImpl( - firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a.fir), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), firDiagnostic as KtPsiDiagnostic, token, ) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index d5e8a253850..4b73a5c4893 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -12,7 +12,9 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe -import org.jetbrains.kotlin.fir.* +import org.jetbrains.kotlin.fir.FirPackageDirective +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.builder.buildImport import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty @@ -32,12 +34,8 @@ import org.jetbrains.kotlin.fir.scopes.processClassifiersByName import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.analysis.api.fir.buildSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -114,7 +112,7 @@ internal object FirReferenceResolveHelper { val boundSymbol = boundSymbol when { !isInLabelReference && boundSymbol is FirCallableSymbol<*> -> - symbolBuilder.callableBuilder.buildExtensionReceiverSymbol(boundSymbol.fir) + symbolBuilder.callableBuilder.buildExtensionReceiverSymbol(boundSymbol) else -> boundSymbol?.fir?.buildSymbol(symbolBuilder) }.let { listOfNotNull(it) } } @@ -345,7 +343,7 @@ internal object FirReferenceResolveHelper { symbolBuilder: KtSymbolByFirBuilder, fir: FirFile ): List { - return listOf(symbolBuilder.buildSymbol(fir)) + return listOf(symbolBuilder.buildSymbol(fir.symbol)) } @OptIn(ExperimentalStdlibApi::class) @@ -414,7 +412,7 @@ internal object FirReferenceResolveHelper { return listOfNotNull(symbolBuilder.createPackageSymbolIfOneExists(FqName.fromSegments(fqNameSegments))) } val referencedClass = referencedSymbol.fir - val referencedSymbolsByFir = listOfNotNull(symbolBuilder.buildSymbol(referencedClass)) + val referencedSymbolsByFir = listOfNotNull(symbolBuilder.buildSymbol(referencedSymbol)) val firSourcePsi = fir.source.psi ?: referencedSymbolsByFir if (firSourcePsi !is KtDotQualifiedExpression) return referencedSymbolsByFir diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt index 1206bbab4b9..0685c060801 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirReference.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.idea.references import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.api.fir.findReferencePsi import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtSymbolBasedReference +import org.jetbrains.kotlin.analysis.api.fir.findReferencePsi import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol @@ -34,7 +34,7 @@ interface KtFirReference : KtReference, KtSymbolBasedReference { private fun KtSymbol.findPsiForReferenceResolve(): PsiElement? { require(this is KtFirSymbol<*>) - return firRef.withFir { it.findReferencePsi() } + return firSymbol.fir.findReferencePsi() } override val resolver get() = KtFirReferenceResolver diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt index 0576773fb97..b7b128cdcdc 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirDelegatingScope.kt @@ -5,12 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.scopes -import org.jetbrains.kotlin.fir.isSubstitutionOverride -import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope -import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.fir.scopes.processClassifiersByName -import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.scopes.KtScope @@ -19,7 +13,13 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.fir.isSubstitutionOverride +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope +import org.jetbrains.kotlin.fir.scopes.FirScope +import org.jetbrains.kotlin.fir.scopes.processClassifiersByName +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.name.Name internal open class KtFirDelegatingScope( @@ -67,14 +67,14 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection, builde callableNames.forEach { name -> val callables = mutableListOf() processFunctionsByName(name) { firSymbol -> - callables.add(builder.functionLikeBuilder.buildFunctionSymbol(firSymbol.fir)) + callables.add(builder.functionLikeBuilder.buildFunctionSymbol(firSymbol)) } processPropertiesByName(name) { firSymbol -> val symbol = when { firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> { - builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir) + builder.variableLikeBuilder.buildVariableSymbol(firSymbol) } - else -> builder.callableBuilder.buildCallableSymbol(firSymbol.fir) + else -> builder.callableBuilder.buildCallableSymbol(firSymbol) } callables.add(symbol) } @@ -97,7 +97,7 @@ internal fun FirScope.getConstructors(builder: KtSymbolByFirBuilder): Sequence() processDeclaredConstructors { firSymbol -> - constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol.fir)) + constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol)) } yieldAll(constructorSymbols) } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt index 8986dffa42a..d5eb090749f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirFileScope.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.scopes -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol import org.jetbrains.kotlin.analysis.api.fir.utils.cached @@ -15,8 +14,12 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.withValidityAssertion -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.FirTypeAlias import org.jetbrains.kotlin.name.Name internal class KtFirFileScope( @@ -33,15 +36,15 @@ internal class KtFirFileScope( private val _callableNames: Set by cached { val result = mutableSetOf() - owner.firRef.withFir { - it.declarations.mapNotNullTo(result) { firDeclaration -> + owner.firSymbol.fir.declarations + .mapNotNullTo(result) { firDeclaration -> when (firDeclaration) { is FirSimpleFunction -> firDeclaration.name is FirProperty -> firDeclaration.name else -> null } } - } + result } @@ -49,51 +52,48 @@ internal class KtFirFileScope( private val _classifierNames: Set by cached { val result = mutableSetOf() - owner.firRef.withFir { - it.declarations.mapNotNullTo(result) { firDeclaration -> + owner.firSymbol.fir.declarations + .mapNotNullTo(result) { firDeclaration -> (firDeclaration as? FirRegularClass)?.name } - } + result } override fun getPossibleClassifierNames(): Set = _classifierNames override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { - owner.firRef.withFir { - sequence { - it.declarations.forEach { firDeclaration -> - val callableDeclaration = when (firDeclaration) { - is FirSimpleFunction -> firDeclaration.takeIf { nameFilter(firDeclaration.name) } - is FirProperty -> firDeclaration.takeIf { nameFilter(firDeclaration.name) } - else -> null - } + sequence { + owner.firSymbol.fir.declarations.forEach { firDeclaration -> + val callableDeclaration = when (firDeclaration) { + is FirSimpleFunction -> firDeclaration.takeIf { nameFilter(firDeclaration.name) } + is FirProperty -> firDeclaration.takeIf { nameFilter(firDeclaration.name) } + else -> null + } - if (callableDeclaration != null) { - yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration)) - } + if (callableDeclaration != null) { + yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration.symbol)) } } } } override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { - owner.firRef.withFir { - sequence { - it.declarations.forEach { firDeclaration -> - val classLikeDeclaration = when (firDeclaration) { + sequence { + owner.firSymbol.fir.declarations.forEach { firDeclaration -> + val classLikeDeclaration = when (firDeclaration) { is FirTypeAlias -> if (nameFilter(firDeclaration.name)) firDeclaration else null is FirRegularClass -> if (nameFilter(firDeclaration.name)) firDeclaration else null else -> null } - if (classLikeDeclaration != null) { - yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration)) - } + if (classLikeDeclaration != null) { + yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration.symbol)) } } } } + override fun getConstructors(): Sequence = emptySequence() override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence = withValidityAssertion { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt index 3e03e7e3354..3477c256277 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/scopes/KtFirNonStarImportingScope.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractSimpleImportingScope -import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultSimpleImportingScope import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name 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 112c8466b12..43aab813013 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 @@ -6,46 +6,41 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.isExtension internal class KtFirAnonymousFunctionSymbol( - fir: FirAnonymousFunction, - resolveState: FirModuleResolveState, + override val firSymbol: FirAnonymousFunctionSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, - private val builder: KtSymbolByFirBuilder -) : KtAnonymousFunctionSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + private val builder: KtSymbolByFirBuilder, +) : KtAnonymousFunctionSymbol(), KtFirSymbol { - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } + override val psi: PsiElement? by cached { firSymbol.fir.findPsi(firSymbol.fir.moduleData.session) } - override val valueParameters: List by firRef.withFirAndCache { fir -> - fir.valueParameters.map { valueParameter -> - builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter) + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + + override val valueParameters: List by cached { firSymbol.createKtValueParameters(builder) } + + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { + firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } - } + override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } - - override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } 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 59b52bf2581..ac03b51ec1c 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 @@ -6,33 +6,30 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder 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.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol internal class KtFirAnonymousObjectSymbol( - fir: FirAnonymousObject, - resolveState: FirModuleResolveState, + override val firSymbol: FirAnonymousObjectSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, - private val builder: KtSymbolByFirBuilder -) : KtAnonymousObjectSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + private val builder: KtSymbolByFirBuilder, +) : KtAnonymousObjectSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } - - override val superTypes: List by cached { firRef.superTypesList(builder) } + override val superTypes: List by cached { firSymbol.superTypesList(builder) } override fun createPointer(): KtSymbolPointer = KtPsiBasedSymbolPointer.createForSymbolFromSource(this) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirArrayOfSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirArrayOfSymbolProvider.kt index 55089713090..84b6f7c72f6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirArrayOfSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirArrayOfSymbolProvider.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -16,13 +16,13 @@ import org.jetbrains.kotlin.name.StandardClassIds object KtFirArrayOfSymbolProvider { internal fun KtFirAnalysisSession.arrayOfSymbol(identifier: Name): KtFirFunctionSymbol? { - val fir = firResolveState.rootModuleSession.symbolProvider.getTopLevelCallableSymbols(kotlinPackage, identifier).firstOrNull { + val firSymbol = firResolveState.rootModuleSession.symbolProvider.getTopLevelCallableSymbols(kotlinPackage, identifier).firstOrNull { /* choose (for byte array) * public fun byteArrayOf(vararg elements: kotlin.Byte): kotlin.ByteArray */ (it as? FirFunctionSymbol<*>)?.fir?.valueParameters?.singleOrNull()?.isVararg == true - }?.fir as? FirSimpleFunction ?: return null - return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(fir) + } as? FirNamedFunctionSymbol ?: return null + return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firSymbol) } private val kotlinPackage = FqName("kotlin") 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 58d4fd3ab56..7a83c72b088 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 @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirBackingFieldSymbolPointer -import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin @@ -17,27 +15,22 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.fir.declarations.FirBackingField -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol internal class KtFirBackingFieldSymbol( - fir: FirBackingField, - resolveState: FirModuleResolveState, + override val firSymbol: FirBackingFieldSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtBackingFieldSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) +) : KtBackingFieldSymbol(), KtFirSymbol { + override val origin: KtSymbolOrigin get() = withValidityAssertion { super.origin } - override val origin: KtSymbolOrigin - get() = withValidityAssertion { super.origin } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.TYPES, builder) - } - - override val owningProperty: KtKotlinPropertySymbol by firRef.withFirAndCache { fir -> - builder.buildSymbol(fir.propertySymbol.fir) as KtKotlinPropertySymbol - } + override val owningProperty: KtKotlinPropertySymbol + get() = withValidityAssertion { + builder.variableLikeBuilder.buildPropertySymbol(firSymbol.propertySymbol) as KtKotlinPropertySymbol + } override fun createPointer(): KtSymbolPointer { return KtFirBackingFieldSymbolPointer(owningProperty.createPointer()) @@ -49,10 +42,10 @@ internal class KtFirBackingFieldSymbol( other as KtFirBackingFieldSymbol - return this.firRef == other.firRef + return this.firSymbol == other.firSymbol } override fun hashCode(): Int { - return firRef.hashCode() * 31 + token.hashCode() + return firSymbol.hashCode() * 31 + token.hashCode() } } \ No newline at end of file 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 cf1d7ceb4d7..934f11a2ccb 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 @@ -7,22 +7,21 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef +import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol internal class KtFirClassInitializerSymbol( - fir: FirAnonymousInitializer, - resolveState: FirModuleResolveState, + override val firSymbol: FirAnonymousInitializerSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, -) : KtClassInitializerSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtClassInitializerSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } override fun createPointer(): KtSymbolPointer { TODO("Figure out how to create such a pointer. Should we give an index to class initializers?") 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 450ed765f77..f9cad035c80 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 @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirConstructorSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind @@ -25,47 +24,39 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass -import org.jetbrains.kotlin.fir.declarations.FirConstructor -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.name.ClassId internal class KtFirConstructorSymbol( - fir: FirConstructor, - resolveState: FirModuleResolveState, + override val firSymbol: FirConstructorSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtConstructorSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtConstructorSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } + + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } + override val valueParameters: List by cached { firSymbol.createKtValueParameters(builder) } - override val valueParameters: List by firRef.withFirAndCache { fir -> - fir.valueParameters.map { valueParameter -> - builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter) + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { + firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } - } - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } - - override val visibility: Visibility get() = getVisibility() - - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } override val containingClassIdIfNonLocal: ClassId? - get() = firRef.withFir { fir -> fir.containingClass()?.classId /* TODO check if local */ } + get() = withValidityAssertion { firSymbol.containingClass()?.classId?.takeUnless { it.isLocal } } - override val isPrimary: Boolean get() = firRef.withFir { it.isPrimary } + override val isPrimary: Boolean get() = withValidityAssertion { firSymbol.isPrimary } + + override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) } - override val typeParameters by firRef.withFirAndCache { fir -> - fir.typeParameters.map { typeParameter -> - builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) - } - } override fun createPointer(): KtSymbolPointer = withValidityAssertion { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } @@ -74,7 +65,7 @@ internal class KtFirConstructorSymbol( } val ownerClassId = containingClassIdIfNonLocal ?: error("ClassId should present for member declaration") - return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firRef.withFir { it.createSignature() }) + return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firSymbol.fir.createSignature()) } override fun equals(other: Any?): Boolean = symbolEquals(other) 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 9741731b0c0..0c44d4abe83 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 @@ -6,52 +6,43 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.containingClass -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.containingClass +import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name internal class KtFirEnumEntrySymbol( - fir: FirEnumEntry, - resolveState: FirModuleResolveState, + override val firSymbol: FirEnumEntrySymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtEnumEntrySymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) +) : KtEnumEntrySymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + override val name: Name get() = withValidityAssertion { firSymbol.name } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val containingEnumClassIdIfNonLocal: ClassId? get() = callableIdIfNonLocal?.classId - override val name: Name get() = firRef.withFir { it.name } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } - - override val containingEnumClassIdIfNonLocal: ClassId? - get() = firRef.withFir { it.containingClass()?.classId?.takeUnless { it.isLocal } } - - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } - return firRef.withFir { fir -> - KtFirEnumEntrySymbolPointer( - fir.symbol.containingClass()?.classId ?: error("Containing class should present for enum entry"), - fir.name - ) - } + return KtFirEnumEntrySymbolPointer( + firSymbol.containingClass()?.classId ?: error("Containing class should present for enum entry"), + firSymbol.name + ) } override fun equals(other: Any?): Boolean = symbolEquals(other) 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 a53d597fd7c..aca59286bf4 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 @@ -7,31 +7,29 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef 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.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol internal class KtFirFileSymbol( - fir: FirFile, - resolveState: FirModuleResolveState, + override val firSymbol: FirFileSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, -) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } TODO("Creating pointers for files from library is not supported yet") } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() 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 b7610c1e666..09d82b94f67 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 @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberFunctio import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelFunctionSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol @@ -24,94 +23,82 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.WrongSymbolForSamConstructor import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name internal class KtFirFunctionSymbol( - fir: FirSimpleFunction, - resolveState: FirModuleResolveState, + override val firSymbol: FirNamedFunctionSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtFunctionSymbol(), KtFirSymbol { - 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 } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } - - override val valueParameters: List by firRef.withFirAndCache { fir -> - fir.valueParameters.map { valueParameter -> - builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter) - } - } - - override val typeParameters by firRef.withFirAndCache { fir -> - fir.typeParameters.map { typeParameter -> - builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) - } - } - - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } - - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } - - - override val isSuspend: Boolean get() = firRef.withFir { it.isSuspend } - override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val isInfix: Boolean get() = firRef.withFir { it.isInfix } - override val isStatic: Boolean get() = firRef.withFir { it.isStatic } +) : KtFunctionSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val name: Name get() = withValidityAssertion { firSymbol.name } override val isBuiltinFunctionInvoke: Boolean - get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + get() = withValidityAssertion { callableIdIfNonLocal in kotlinFunctionInvokeCallableIds } - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + + override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) } + override val valueParameters: List by cached { firSymbol.createKtValueParameters(builder) } - override val isOperator: Boolean get() = firRef.withFir { it.isOperator } - override val isExternal: Boolean get() = firRef.withFir { it.isExternal } - override val isInline: Boolean get() = firRef.withFir { it.isInline } - override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } + + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } + + override val isSuspend: Boolean get() = withValidityAssertion { firSymbol.isSuspend } + override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val isInfix: Boolean get() = withValidityAssertion { firSymbol.isInfix } + override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic } + + + override val isOperator: Boolean get() = withValidityAssertion { firSymbol.isOperator } + override val isExternal: Boolean get() = withValidityAssertion { firSymbol.isExternal } + override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } + override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } override val symbolKind: KtSymbolKind - get() = firRef.withFir { fir -> + get() = withValidityAssertion { when { - fir.isLocal -> KtSymbolKind.LOCAL - fir.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL + firSymbol.isLocal -> KtSymbolKind.LOCAL + firSymbol.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL else -> KtSymbolKind.CLASS_MEMBER } } - override val modality: Modality get() = getModality() - override val visibility: Visibility get() = getVisibility() + override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } override fun createPointer(): KtSymbolPointer { - if (firRef.withFir { it.origin != FirDeclarationOrigin.SubstitutionOverride }) { + if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } } return when (symbolKind) { - KtSymbolKind.TOP_LEVEL -> firRef.withFir { fir -> - KtFirTopLevelFunctionSymbolPointer(fir.symbol.callableId, fir.createSignature()) - } - KtSymbolKind.CLASS_MEMBER -> firRef.withFir { fir -> + KtSymbolKind.TOP_LEVEL -> + KtFirTopLevelFunctionSymbolPointer(firSymbol.callableId, firSymbol.createSignature()) + + KtSymbolKind.CLASS_MEMBER -> KtFirMemberFunctionSymbolPointer( - fir.containingClass()?.classId ?: error("ClassId should not be null for member function"), - fir.name, - fir.createSignature() + firSymbol.containingClass()?.classId ?: error("ClassId should not be null for member function"), + firSymbol.name, + firSymbol.createSignature() ) - } + KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors fun is not supported yet") KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException( callableIdIfNonLocal?.toString() ?: name.asString() 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 51aa3a8dc83..0cc2a6f4b88 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 @@ -6,49 +6,47 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.fir.declarations.FirField -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.utils.isStatic -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaFieldSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass +import org.jetbrains.kotlin.fir.declarations.utils.isStatic +import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal +import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name internal class KtFirJavaFieldSymbol( - fir: FirField, - resolveState: FirModuleResolveState, + override val firSymbol: FirFieldSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtJavaFieldSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtJavaFieldSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.TYPES, builder) - } - override val isVal: Boolean get() = firRef.withFir { it.isVal } - override val name: Name get() = firRef.withFir { it.name } + override val isVal: Boolean get() = withValidityAssertion { firSymbol.fir.isVal } + override val name: Name get() = withValidityAssertion { firSymbol.name } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } - override val modality: Modality get() = getModality() + override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } - override val visibility: Visibility get() = getVisibility() - override val isStatic: Boolean get() = firRef.withFir { it.isStatic } + override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic } override fun createPointer(): KtSymbolPointer { - val containingClassId = firRef.withFir { it.containingClass()?.classId } + val containingClassId = firSymbol.containingClass()?.classId ?: error("Cannot find parent class for java field $callableIdIfNonLocal") return KtFirJavaFieldSymbolPointer(containingClassId, name) 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 e3c50101afa..649af173efb 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 @@ -7,14 +7,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.KtFakeSourceElementKind +import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature -import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol @@ -26,107 +25,111 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.WrongSymbolForSamConstructor import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin -import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name internal class KtFirKotlinPropertySymbol( - fir: FirProperty, - resolveState: FirModuleResolveState, + override val firSymbol: FirPropertySymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtKotlinPropertySymbol(), KtFirSymbol { +) : KtKotlinPropertySymbol(), KtFirSymbol { init { - assert(!fir.isLocal) - check(fir !is FirSyntheticProperty) + assert(!firSymbol.isLocal) + check(firSymbol !is FirSyntheticPropertySymbol) + check(firSymbol.fir !is FirSyntheticProperty) } - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + override val isDelegatedProperty: Boolean + get() = withValidityAssertion { firSymbol.delegateFieldSymbol != null } - override val isVal: Boolean get() = firRef.withFir { it.isVal } - override val name: Name get() = firRef.withFir { it.name } + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } + override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal } + override val name: Name get() = withValidityAssertion { firSymbol.name } - override val typeParameters: List by cached { - fir.typeParameters.map { builder.classifierBuilder.buildTypeParameterSymbol(it) } - } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } + override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } + override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() } - override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val initializer by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> - fir.initializer?.asKtInitializerValue() - } override val symbolKind: KtSymbolKind - get() = firRef.withFir { fir -> - when (fir.containingClass()?.classId) { + get() = withValidityAssertion { + when (firSymbol.containingClass()?.classId) { null -> KtSymbolKind.TOP_LEVEL else -> KtSymbolKind.CLASS_MEMBER } } - override val modality: Modality get() = getModality() + override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } - override val visibility: Visibility get() = getVisibility() + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val typeParameters: List + get() = withValidityAssertion { firSymbol.createKtTypeParameters(builder) } - override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.getter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol - } + override val getter: KtPropertyGetterSymbol? + get() = withValidityAssertion { + firSymbol.getterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol + } - override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol - } + override val setter: KtPropertySetterSymbol? + get() = withValidityAssertion { + firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol + } // NB: `field` in accessors indicates the property should have a backing field. To see that, though, we need BODY_RESOLVE. - override val hasBackingField: Boolean get() = firRef.withFir(FirResolvePhase.BODY_RESOLVE) { it.hasBackingField } + override val hasBackingField: Boolean + get() = withValidityAssertion { + firSymbol.ensureResolved(FirResolvePhase.BODY_RESOLVE) + firSymbol.fir.hasBackingField + } + override val isLateInit: Boolean get() = withValidityAssertion { firSymbol.isLateInit } - override val isDelegatedProperty: Boolean get() = firRef.withFir { it.delegateFieldSymbol != null } - - override val isLateInit: Boolean get() = firRef.withFir { it.isLateInit } - - override val isConst: Boolean get() = firRef.withFir { it.isConst } override val isFromPrimaryConstructor: Boolean - get() = firRef.withFir { - it.fromPrimaryConstructor == true || it.source?.kind == KtFakeSourceElementKind.PropertyFromParameter + get() = withValidityAssertion { + firSymbol.fir.fromPrimaryConstructor == true || firSymbol.source?.kind == KtFakeSourceElementKind.PropertyFromParameter } - override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val isStatic: Boolean get() = firRef.withFir { it.isStatic } - override val hasGetter: Boolean get() = firRef.withFir { it.getter != null } - override val hasSetter: Boolean get() = firRef.withFir { it.setter != null } + override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val isConst: Boolean get() = withValidityAssertion { firSymbol.isConst } + override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic } + + override val hasGetter: Boolean get() = withValidityAssertion { firSymbol.getterSymbol != null } + override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null } override fun createPointer(): KtSymbolPointer { - if (firRef.withFir { it.origin != FirDeclarationOrigin.SubstitutionOverride }) { + if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } } return when (symbolKind) { KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level properties is not supported yet") - KtSymbolKind.CLASS_MEMBER -> firRef.withFir { fir -> + KtSymbolKind.CLASS_MEMBER -> KtFirMemberPropertySymbolPointer( - fir.containingClass()?.classId ?: error("ClassId should not be null for member property"), - fir.name, - fir.createSignature() + firSymbol.containingClass()?.classId ?: error("ClassId should not be null for member property"), + firSymbol.name, + firSymbol.createSignature() ) - } + KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors is not supported yet") KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString()) KtSymbolKind.SAM_CONSTRUCTOR -> throw WrongSymbolForSamConstructor(this::class.java.simpleName) 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 89cada40708..5cb16db5525 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 @@ -6,13 +6,9 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException @@ -20,27 +16,28 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol import org.jetbrains.kotlin.name.Name internal class KtFirLocalVariableSymbol( - fir: FirProperty, - resolveState: FirModuleResolveState, + override val firSymbol: FirPropertySymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder ) : KtLocalVariableSymbol(), - KtFirSymbol { + KtFirSymbol { init { - assert(fir.isLocal) + assert(firSymbol.isLocal) } - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + override val psi: PsiElement? by cached { firSymbol.findPsi() } + + override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal } + override val name: Name get() = withValidityAssertion { firSymbol.name } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } - override val isVal: Boolean get() = firRef.withFir { it.isVal } - override val name: Name get() = firRef.withFir { it.name } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL override fun createPointer(): KtSymbolPointer { 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 4af06e5def6..8a1747496ca 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 @@ -6,19 +6,11 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.* -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind @@ -27,85 +19,99 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.fir.declarations.utils.* +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name internal class KtFirNamedClassOrObjectSymbol( - fir: FirRegularClass, - resolveState: FirModuleResolveState, + override val firSymbol: FirRegularClassSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtNamedClassOrObjectSymbol(), KtFirSymbol { - 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 } +) : KtNamedClassOrObjectSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } + + override val name: Name get() = withValidityAssertion { firSymbol.name } + override val classIdIfNonLocal: ClassId? - get() = firRef.withFir { fir -> - fir.symbol.classId.takeUnless { it.isLocal } + get() = withValidityAssertion { firSymbol.classId.takeUnless { it.isLocal } } + + /* FirRegularClass modality is not modified by STATUS, so it can be taken from RAW */ + override val modality: Modality + get() = withValidityAssertion { + firSymbol.fir.modality + ?: when (classKind) { // default modality + KtClassKind.INTERFACE -> Modality.ABSTRACT + // Enum class should not be `final`, since its entries extend it. + // It could be either `abstract` w/o ctor, or empty modality w/ private ctor. + KtClassKind.ENUM_CLASS -> Modality.OPEN + else -> Modality.FINAL + } } - /* FirRegularClass modality does not modified by STATUS so it can be taken from RAW */ - override val modality: Modality - get() = getModality( - FirResolvePhase.RAW_FIR, - when (classKind) { // default modality - KtClassKind.INTERFACE -> Modality.ABSTRACT - // Enum class should not be `final`, since its entries extend it. - // It could be either `abstract` w/o ctor, or empty modality w/ private ctor. - KtClassKind.ENUM_CLASS -> Modality.OPEN - else -> Modality.FINAL - } - ) - /* FirRegularClass visibility are not modified by STATUS only for Unknown so it can be taken from RAW */ + /* FirRegularClass visibility is not modified by STATUS only for Unknown, so it can be taken from RAW */ override val visibility: Visibility - get() = when (val possiblyRawVisibility = getVisibility(FirResolvePhase.RAW_FIR)) { - Visibilities.Unknown -> if (firRef.withFir { it.isLocal }) Visibilities.Local else Visibilities.Public + get() = when (val possiblyRawVisibility = firSymbol.fir.visibility) { + Visibilities.Unknown -> if (firSymbol.fir.isLocal) Visibilities.Local else Visibilities.Public else -> possiblyRawVisibility } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } - override val isInner: Boolean get() = firRef.withFir { it.isInner } - override val isData: Boolean get() = firRef.withFir { it.isData } - override val isInline: Boolean get() = firRef.withFir { it.isInline } - override val isFun: Boolean get() = firRef.withFir { it.isFun } - override val isExternal: Boolean get() = firRef.withFir { it.isExternal } + override val isInner: Boolean get() = withValidityAssertion { firSymbol.isInner } + override val isData: Boolean get() = withValidityAssertion { firSymbol.isData } + override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } + override val isFun: Boolean get() = withValidityAssertion { firSymbol.isFun } + override val isExternal: Boolean get() = withValidityAssertion { firSymbol.isExternal } - override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir -> - fir.companionObjectSymbol?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it.fir) } - } - - override val superTypes: List by cached { - firRef.superTypesAndAnnotationsListForRegularClass(builder) - } - - override val typeParameters by firRef.withFirAndCache { fir -> - fir.typeParameters.filterIsInstance().map { typeParameter -> - builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) + override val companionObject: KtFirNamedClassOrObjectSymbol? by cached { + firSymbol.companionObjectSymbol?.let { + builder.classifierBuilder.buildNamedClassOrObjectSymbol(it) } } + override val superTypes: List by cached { + firSymbol.superTypesAndAnnotationsListForRegularClass(builder) + } + + override val typeParameters = withValidityAssertion { + firSymbol.fir.typeParameters.filterIsInstance().map { typeParameter -> + builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol) + } + } + + override val classKind: KtClassKind - get() = firRef.withFir { fir -> - when (fir.classKind) { + get() = withValidityAssertion { + when (firSymbol.classKind) { ClassKind.INTERFACE -> KtClassKind.INTERFACE ClassKind.ENUM_CLASS -> KtClassKind.ENUM_CLASS ClassKind.ENUM_ENTRY -> KtClassKind.ENUM_ENTRY ClassKind.ANNOTATION_CLASS -> KtClassKind.ANNOTATION_CLASS ClassKind.CLASS -> KtClassKind.CLASS - ClassKind.OBJECT -> if (fir.isCompanion) KtClassKind.COMPANION_OBJECT else KtClassKind.OBJECT + ClassKind.OBJECT -> if (firSymbol.isCompanion) KtClassKind.COMPANION_OBJECT else KtClassKind.OBJECT } } + override val symbolKind: KtSymbolKind - get() = firRef.withFir { fir -> + get() = withValidityAssertion { when { - fir.isLocal -> KtSymbolKind.LOCAL - fir.symbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER + firSymbol.isLocal -> KtSymbolKind.LOCAL + firSymbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER else -> KtSymbolKind.TOP_LEVEL } } + override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } if (symbolKind == KtSymbolKind.LOCAL) { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirOverrideInfoProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirOverrideInfoProvider.kt index 8034894ce00..062fab4110f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirOverrideInfoProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirOverrideInfoProvider.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.util.ImplementationStatus internal class KtFirOverrideInfoProvider( @@ -36,15 +37,11 @@ internal class KtFirOverrideInfoProvider( require(classSymbol is KtFirSymbol<*>) // Inspecting visibility requires resolving to status - return memberSymbol.firRef.withFir(FirResolvePhase.STATUS) outer@{ memberFir -> - if (memberFir !is FirCallableDeclaration) return@outer false + classSymbol.firSymbol.ensureResolved(FirResolvePhase.STATUS) + val memberFir = memberSymbol.firSymbol.fir as? FirCallableDeclaration ?: return false + val parentClassFir = classSymbol.firSymbol.fir as? FirClass ?: return false - classSymbol.firRef.withFir inner@{ parentClassFir -> - if (parentClassFir !is FirClass) return@inner false - - memberFir.isVisibleInClass(parentClassFir) - } - } + return memberFir.isVisibleInClass(parentClassFir) } override fun getImplementationStatus(memberSymbol: KtCallableSymbol, parentClassSymbol: KtClassOrObjectSymbol): ImplementationStatus? { @@ -52,39 +49,32 @@ internal class KtFirOverrideInfoProvider( require(parentClassSymbol is KtFirSymbol<*>) // Inspecting implementation status requires resolving to status - return memberSymbol.firRef.withFir(FirResolvePhase.STATUS) outer@{ memberFir -> - if (memberFir !is FirCallableDeclaration) return@outer null + parentClassSymbol.firSymbol.ensureResolved(FirResolvePhase.STATUS) + val memberFir = memberSymbol.firSymbol.fir as? FirCallableDeclaration ?: return null + val parentClassFir = parentClassSymbol.firSymbol.fir as? FirClass ?: return null - parentClassSymbol.firRef.withFir inner@{ parentClassFir -> - if (parentClassFir !is FirClass) return@inner null - - memberFir.symbol.getImplementationStatus( - SessionHolderImpl(rootModuleSession, ScopeSession()), - parentClassFir.symbol - ) - } - } + return memberFir.symbol.getImplementationStatus( + SessionHolderImpl(rootModuleSession, ScopeSession()), + parentClassFir.symbol + ) } override fun getOriginalContainingClassForOverride(symbol: KtCallableSymbol): KtClassOrObjectSymbol? { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir(FirResolvePhase.STATUS) { firDeclaration -> - if (firDeclaration !is FirCallableDeclaration) return@withFir null - val containingClass = - getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.toSymbol(rootModuleSession) ?: return@withFir null - analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(containingClass.fir) as? KtClassOrObjectSymbol - } + symbol.firSymbol.ensureResolved(FirResolvePhase.STATUS) + val firDeclaration = symbol.firSymbol.fir as FirCallableDeclaration + val containingClass = + getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.toSymbol(rootModuleSession) ?: return null + return analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(containingClass.fir.symbol) as? KtClassOrObjectSymbol + } override fun getOriginalOverriddenSymbol(symbol: KtCallableSymbol): KtCallableSymbol? { require(symbol is KtFirSymbol<*>) - return symbol.firRef.withFir(FirResolvePhase.STATUS) { firDeclaration -> - if (firDeclaration !is FirCallableDeclaration) return@withFir null - with(analysisSession) { - getOriginalOverriddenSymbol(firDeclaration) - ?.buildSymbol((analysisSession as KtFirAnalysisSession).firSymbolBuilder) as KtCallableSymbol? - } - } + symbol.firSymbol.ensureResolved(FirResolvePhase.STATUS) + val firDeclaration = symbol.firSymbol.fir as FirCallableDeclaration + return getOriginalOverriddenSymbol(firDeclaration) + ?.buildSymbol(analysisSession.firSymbolBuilder) as KtCallableSymbol? } private fun getOriginalOverriddenSymbol(member: FirCallableDeclaration): FirCallableDeclaration? { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt index e6e213ab6e9..899e702024f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirPackageSymbol.kt @@ -11,14 +11,15 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiManager import com.intellij.psi.impl.file.PsiPackageImpl import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointer +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.providers.createPackageProvider import org.jetbrains.kotlin.name.FqName class KtFirPackageSymbol( 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 a311183975d..5688d64aca4 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 @@ -10,69 +10,67 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder 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.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isOverride +import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.name.CallableId internal class KtFirPropertyGetterSymbol( - fir: FirPropertyAccessor, - resolveState: FirModuleResolveState, + override val firSymbol: FirPropertyAccessorSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder, -) : KtPropertyGetterSymbol(), KtFirSymbol { +) : KtPropertyGetterSymbol(), KtFirSymbol { init { - require(fir.isGetter) + require(firSymbol.isGetter) } - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor } - override val isInline: Boolean get() = firRef.withFir { it.isInline } - override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val hasBody: Boolean get() = firRef.withFir { it.body != null } + override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor } + override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } + override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } - override val modality: Modality get() = getModality() - override val visibility: Visibility get() = getVisibility() - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } + /** - * Returns [CallableId] of the delegated Java method if the corresponding property of this getter is a synthetic Java property. + * Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property. * Otherwise, returns `null` */ - override val callableIdIfNonLocal: CallableId? by firRef.withFirAndCache { fir -> + override val callableIdIfNonLocal: CallableId? by cached { + val fir = firSymbol.fir if (fir is FirSyntheticPropertyAccessor) { fir.delegate.symbol.callableId } else null } - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } + override val valueParameters: List get() = withValidityAssertion { emptyList() } - override val valueParameters: List - get() = emptyList() - - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } 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 24bc2127f72..61b1dda8154 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 @@ -10,74 +10,72 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder 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.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isOverride +import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal +import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol import org.jetbrains.kotlin.name.CallableId internal class KtFirPropertySetterSymbol( - fir: FirPropertyAccessor, - resolveState: FirModuleResolveState, + override val firSymbol: FirPropertyAccessorSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder, -) : KtPropertySetterSymbol(), KtFirSymbol { +) : KtPropertySetterSymbol(), KtFirSymbol { + init { - require(fir.isSetter) + require(firSymbol.isSetter) } - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor } - override val isInline: Boolean get() = firRef.withFir { it.isInline } - override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val hasBody: Boolean get() = firRef.withFir { it.body != null } + override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor } + override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline } + override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null } - override val modality: Modality get() = getModality() - override val visibility: Visibility get() = getVisibility() - - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } /** * Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property. * Otherwise, returns `null` */ - override val callableIdIfNonLocal: CallableId? by firRef.withFirAndCache { fir -> + override val callableIdIfNonLocal: CallableId? by cached { + val fir = firSymbol.fir if (fir is FirSyntheticPropertyAccessor) { fir.delegate.symbol.callableId } else null } - override val parameter: KtValueParameterSymbol by firRef.withFirAndCache { fir -> - builder.variableLikeBuilder.buildValueParameterSymbol(fir.valueParameters.single()) + override val parameter: KtValueParameterSymbol by cached { + builder.variableLikeBuilder.buildValueParameterSymbol(firSymbol.fir.valueParameters.single().symbol) } override val valueParameters: List by cached { listOf(parameter) } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } - - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } 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 fa18b85b829..b7b28325fb4 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,35 +10,37 @@ import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef 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.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.originalOrSelf +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol internal class KtFirReceiverParameterSymbol( - fir: FirCallableDeclaration, - resolveState: FirModuleResolveState, + val firSymbol: FirCallableSymbol<*>, + val resolveState: FirModuleResolveState, override val token: ValidityToken, _builder: KtSymbolByFirBuilder ) : KtReceiverParameterSymbol(), ValidityTokenOwner { + override val psi: PsiElement? by cached { firSymbol.fir.receiverTypeRef?.findPsi(firSymbol.fir.moduleData.session) } + init { - require(fir.receiverTypeRef != null) { "$fir doesn't have an extension receiver." } + require(firSymbol.fir.receiverTypeRef != null) { "$firSymbol doesn't have an extension receiver." } } private val builder by weakRef(_builder) - internal val firRef = firRef(fir, resolveState) override val type: KtType by cached { - firRef.receiverType(builder) ?: throw IllegalStateException("$fir doesn't have an extension receiver.") + firSymbol.receiverType(builder) + ?: error("$firSymbol doesn't have an extension receiver.") } - override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() } - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.findPsi(fir.moduleData.session) } + override val origin: KtSymbolOrigin = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() } override fun createPointer(): KtSymbolPointer { TODO("Probably just create a pointer based on the underlying declaration") 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 d144a81fe61..bd9a1bbb953 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 @@ -6,56 +6,55 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction -import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.findPsi import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirSamConstructorSymbolPointer import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name internal class KtFirSamConstructorSymbol( - fir: FirSimpleFunction, - resolveState: FirModuleResolveState, + override val firSymbol: FirNamedFunctionSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtSamConstructorSymbol(), KtFirSymbol { - 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 } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } +) : KtSamConstructorSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val name: Name get() = withValidityAssertion { firSymbol.name } - override val valueParameters: List by firRef.withFirAndCache { fir -> - fir.valueParameters.map { valueParameter -> - builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter) + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + + override val valueParameters: List + get() = withValidityAssertion { + firSymbol.fir.valueParameters.map { valueParameter -> + builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter.symbol) + } } - } - override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) } + override val hasStableParameterNames: Boolean + get() = withValidityAssertion { + firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) + } - override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } + override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } + + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } override fun createPointer(): KtSymbolPointer { - return firRef.withFir { fir -> - val callableId = fir.symbol.callableId - KtFirSamConstructorSymbolPointer(ClassId(callableId.packageName, callableId.callableName)) - } + val callableId = firSymbol.callableId + return KtFirSamConstructorSymbolPointer(ClassId(callableId.packageName, callableId.callableName)) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt index 43f932fc88e..0e10dd320b1 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbol.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner -import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin @@ -17,19 +17,22 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.originalIfFakeOverride import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectData +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol -internal interface KtFirSymbol : KtSymbol, ValidityTokenOwner { - val firRef: FirRefWithValidityCheck +internal interface KtFirSymbol> : KtSymbol, ValidityTokenOwner { + val firSymbol: S - override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() } + abstract val resolveState: FirModuleResolveState + + override val origin: KtSymbolOrigin get() = firSymbol.fir.ktSymbolOrigin() } internal fun KtFirSymbol<*>.symbolEquals(other: Any?): Boolean { if (other !is KtFirSymbol<*>) return false - return this.firRef == other.firRef + return this.firSymbol == other.firSymbol } -internal fun KtFirSymbol<*>.symbolHashCode(): Int = firRef.hashCode() +internal fun KtFirSymbol<*>.symbolHashCode(): Int = firSymbol.hashCode() internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (origin) { FirDeclarationOrigin.Source -> { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt index cb5275942a0..b32880033c2 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSymbolProvider.kt @@ -15,12 +15,11 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclarationOfType -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirSymbolOfType +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.renderWithType import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider -import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol +import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -41,87 +40,87 @@ internal class KtFirSymbolProvider( "Creating KtValueParameterSymbol for function type parameter is not possible. Please see the KDoc of getParameterSymbol" ) - psi.isLoopParameter -> psi.withFirDeclarationOfType(resolveState) { + psi.isLoopParameter -> psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(it) } - else -> psi.withFirDeclarationOfType(resolveState) { + else -> psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(it) } } } override fun getFileSymbol(psi: KtFile): KtFileSymbol = withValidityAssertion { - firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(resolveState)) + firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(resolveState).symbol) } override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { fir -> + psi.withFirSymbolOfType, KtFunctionLikeSymbol>(resolveState) { fir -> when (fir) { - is FirSimpleFunction -> { + is FirNamedFunctionSymbol -> { if (fir.origin == FirDeclarationOrigin.SamConstructor) { firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(fir) } else { firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(fir) } } - is FirAnonymousFunction -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(fir) - else -> error("Unexpected ${fir.renderWithType()}") + is FirAnonymousFunctionSymbol -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(fir) + else -> error("Unexpected ${fir.fir.renderWithType()}") } } } override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(it) } } override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(it) } } override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(it) } } override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.buildEnumEntrySymbol(it) } } override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(it) } firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState)) } override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(it) } } override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(it) } } override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion { - psi.objectDeclaration.withFirDeclarationOfType(resolveState) { + psi.objectDeclaration.withFirSymbolOfType(resolveState) { firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol(it) } } override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType, KtClassOrObjectSymbol>(resolveState) { firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(it) } } @@ -130,31 +129,31 @@ internal class KtFirSymbolProvider( require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression) // A KtClassOrObject may also map to an FirEnumEntry. Hence, we need to return null in this case. if (psi is KtEnumEntry) return null - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it) } } override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(it) } } override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol = withValidityAssertion { - psi.withFirDeclarationOfType(resolveState) { + psi.withFirSymbolOfType(resolveState) { firSymbolBuilder.anonymousInitializerBuilder.buildClassInitializer(it) } } override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { val symbol = firSymbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: return null - firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol.fir) + firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol) } override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence { val firs = firSymbolProvider.getTopLevelCallableSymbols(packageFqName, name) - return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol.fir) } + return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol) } } override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol = KtFirPackageSymbol(FqName.ROOT, resolveState.project, token) 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 81e666e34c9..c8287defde7 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 @@ -10,11 +10,8 @@ import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration import org.jetbrains.kotlin.analysis.api.fir.findPsi - import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer -import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue import org.jetbrains.kotlin.analysis.api.fir.utils.cached -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken @@ -24,76 +21,75 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.containingClass -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.isOverride import org.jetbrains.kotlin.fir.declarations.utils.isStatic +import org.jetbrains.kotlin.fir.declarations.utils.modality +import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.isExtension import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name internal class KtFirSyntheticJavaPropertySymbol( - fir: FirSyntheticProperty, - resolveState: FirModuleResolveState, + override val firSymbol: FirSyntheticPropertySymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtSyntheticJavaPropertySymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtSyntheticJavaPropertySymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val isVal: Boolean get() = firRef.withFir { it.isVal } - override val name: Name get() = firRef.withFir { it.name } - override val returnType: KtType by cached { - firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) - } + override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal } + override val name: Name get() = withValidityAssertion { firSymbol.name } - override val typeParameters: List by cached { - fir.typeParameters.map { builder.classifierBuilder.buildTypeParameterSymbol(it) } - } + override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) } + override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) } - override val receiverType: KtType? by cached { - firRef.receiverType(builder) - } - override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null } - override val initializer: KtInitializerValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir -> - fir.initializer?.asKtInitializerValue() - } - - override val modality: Modality get() = getModality() - override val visibility: Visibility get() = getVisibility() - - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val typeParameters: List + get() = withValidityAssertion { firSymbol.createKtTypeParameters(builder) } - override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal() + override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension } - override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol - } + override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() } + + override val modality: Modality get() = withValidityAssertion { firSymbol.modality ?: firSymbol.invalidModalityError() } + override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility } + + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } + + override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() } + + override val getter: KtPropertyGetterSymbol + get() = withValidityAssertion { + builder.callableBuilder.buildGetterSymbol(firSymbol.getterSymbol!!) + } override val javaGetterSymbol: KtFunctionSymbol get() { - return firRef.withFir { builder.functionLikeBuilder.buildFunctionSymbol(it.getter.delegate) } + val fir = firSymbol.fir as FirSyntheticProperty + return builder.functionLikeBuilder.buildFunctionSymbol(fir.getter.delegate.symbol) } override val javaSetterSymbol: KtFunctionSymbol? get() { - return firRef.withFir { fir -> - fir.setter?.delegate?.let { setter -> builder.functionLikeBuilder.buildFunctionSymbol(setter) } - } + val fir = firSymbol.fir as FirSyntheticProperty + return fir.setter?.delegate?.let { builder.functionLikeBuilder.buildFunctionSymbol(it.symbol) } } - override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol - } + override val setter: KtPropertySetterSymbol? + get() = withValidityAssertion { + firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol + } - override val isFromPrimaryConstructor: Boolean get() = false - override val isOverride: Boolean get() = firRef.withFir { it.isOverride } - override val isStatic: Boolean get() = firRef.withFir { it.isStatic } + override val isFromPrimaryConstructor: Boolean get() = withValidityAssertion { false } + override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride } + override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic } - override val hasSetter: Boolean get() = firRef.withFir { it.setter != null } + override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null } override val origin: KtSymbolOrigin get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY } override fun createPointer(): KtSymbolPointer { - val containingClassId = firRef.withFir { it.containingClass()?.classId } + val containingClassId = firSymbol.containingClass()?.classId ?: error("Cannot find parent class for synthetic java property $callableIdIfNonLocal") return KtFirJavaSyntheticPropertySymbolPointer(containingClassId, name) 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 7c4c88f961f..e16d9890710 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 @@ -7,58 +7,49 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList -import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirTypeAlias -import org.jetbrains.kotlin.fir.declarations.FirTypeParameter -import org.jetbrains.kotlin.fir.declarations.utils.isLocal -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder 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.utils.firRef -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name internal class KtFirTypeAliasSymbol( - fir: FirTypeAlias, - private val resolveState: FirModuleResolveState, + override val firSymbol: FirTypeAliasSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder, -) : KtTypeAliasSymbol(), KtFirSymbol { +) : KtTypeAliasSymbol(), KtFirSymbol { - 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 } - override val classIdIfNonLocal: ClassId get() = firRef.withFir { it.symbol.classId } + override val psi: PsiElement? by cached { firSymbol.findPsi() } + override val name: Name get() = withValidityAssertion { firSymbol.name } + override val classIdIfNonLocal: ClassId? get() = withValidityAssertion { firSymbol.getClassIdIfNonLocal() } override val visibility: Visibility - get() = when (val possiblyRawVisibility = getVisibility(FirResolvePhase.RAW_FIR)) { - Visibilities.Unknown -> Visibilities.Public - else -> possiblyRawVisibility + get() = withValidityAssertion { + when (val possiblyRawVisibility = firSymbol.fir.visibility) { + Visibilities.Unknown -> Visibilities.Public + else -> possiblyRawVisibility + } } - override val typeParameters by firRef.withFirAndCache { fir -> - fir.typeParameters.filterIsInstance().map { typeParameter -> - builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) - } - } + override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) } - override val expandedType: KtType by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir -> - builder.typeBuilder.buildKtType(fir.expandedTypeRef) - } + override val expandedType: KtType by cached { builder.typeBuilder.buildKtType(firSymbol.resolvedExpandedTypeRef) } override val annotationsList: KtAnnotationsList by cached { - KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) + KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } override fun createPointer(): KtSymbolPointer { 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 97e10a084dd..df16195dffc 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 @@ -6,27 +6,26 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.analysis.api.types.KtType -import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.resolve.transformers.resolveSupertypesInTheAir +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.types.FirTypeRef -internal fun FirRefWithValidityCheck.superTypesList(builder: KtSymbolByFirBuilder): List = - withFir(FirResolvePhase.SUPER_TYPES) { fir -> - fir.superTypeRefs.mapToKtType(builder) +internal fun FirClassSymbol<*>.superTypesList(builder: KtSymbolByFirBuilder): List = + resolvedSuperTypeRefs.mapToKtType(builder) + +internal fun FirRegularClassSymbol.superTypesAndAnnotationsListForRegularClass(builder: KtSymbolByFirBuilder): List { + val fir = fir + + if (fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) { + return fir.superTypeRefs.mapToKtType(builder) } -internal fun FirRefWithValidityCheck.superTypesAndAnnotationsListForRegularClass(builder: KtSymbolByFirBuilder): List { - return withFir { fir -> - if (fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) { - fir.superTypeRefs.mapToKtType(builder) - } else null - } ?: withFirByType(ResolveType.NoResolve) { fir -> - fir.resolveSupertypesInTheAir(builder.rootSession).mapToKtType(builder) - } + return fir.resolveSupertypesInTheAir(builder.rootSession).mapToKtType(builder) } private fun List.mapToKtType( @@ -35,15 +34,11 @@ private fun List.mapToKtType( builder.typeBuilder.buildKtType(typeRef) } -internal fun FirRefWithValidityCheck.returnType( - typeResolvePhase: FirResolvePhase, - builder: KtSymbolByFirBuilder -) = withFir(typeResolvePhase) { builder.typeBuilder.buildKtType(it.returnTypeRef) } +internal fun FirCallableSymbol<*>.returnType(builder: KtSymbolByFirBuilder): KtType = + builder.typeBuilder.buildKtType(resolvedReturnType) -internal fun FirRefWithValidityCheck.receiverType( - builder: KtSymbolByFirBuilder -): KtType? = withFir(FirResolvePhase.TYPES) { fir -> - fir.receiverTypeRef?.let { receiver -> +internal fun FirCallableSymbol<*>.receiverType(builder: KtSymbolByFirBuilder): KtType? = + resolvedReceiverTypeRef?.let { receiver -> builder.typeBuilder.buildKtType(receiver) } -} + 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 4c44655ef3f..d064dc0d908 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 @@ -6,38 +6,36 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirTypeParameter -import org.jetbrains.kotlin.analysis.api.fir.findPsi -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder -import org.jetbrains.kotlin.analysis.api.fir.utils.firRef -import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef +import org.jetbrains.kotlin.analysis.api.fir.findPsi +import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance internal class KtFirTypeParameterSymbol( - fir: FirTypeParameter, - resolveState: FirModuleResolveState, + override val firSymbol: FirTypeParameterSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtTypeParameterSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtTypeParameterSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val name: Name get() = firRef.withFir { it.name } + override val name: Name get() = withValidityAssertion { firSymbol.name } - override val upperBounds: List by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> - fir.bounds.map { type -> builder.typeBuilder.buildKtType(type) } + override val upperBounds: List by cached { + firSymbol.resolvedBounds.map { type -> builder.typeBuilder.buildKtType(type) } } - override val variance: Variance get() = firRef.withFir { it.variance } - override val isReified: Boolean get() = firRef.withFir { it.isReified } + override val variance: Variance get() = withValidityAssertion { firSymbol.variance } + override val isReified: Boolean get() = withValidityAssertion { firSymbol.isReified } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } 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 8fe6b984a8e..2144c51b6be 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 @@ -10,27 +10,25 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder 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.utils.firRef import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.declarations.getAnnotationsByClassId import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.unwrapArgument import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.renderWithType +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.types.arrayElementType -import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.customAnnotations import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.StandardClassIds @@ -39,68 +37,32 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.utils.addToStdlib.safeAs internal class KtFirValueParameterSymbol( - fir: FirValueParameter, - resolveState: FirModuleResolveState, + override val firSymbol: FirValueParameterSymbol, + override val resolveState: FirModuleResolveState, override val token: ValidityToken, private val builder: KtSymbolByFirBuilder -) : KtValueParameterSymbol(), KtFirSymbol { - override val firRef = firRef(fir, resolveState) - override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) } +) : KtValueParameterSymbol(), KtFirSymbol { + override val psi: PsiElement? by cached { firSymbol.findPsi() } - override val name: Name by cached { - firRef.withFir { fir -> - val defaultName = fir.name - if (fir.psi != null) return@withFir defaultName + override val name: Name by cached { firSymbol.getNameByAnnotation(resolveState) } - // The case where PSI is null is when calling `invoke()` on a variable with functional type, e.g. `x(1)` below: - // - // fun foo(x: (item: Int) -> Unit) { x(1) } - // fun bar(x: Function1<@ParameterName("item") Int, Unit>) { x(1) } - // - // The function being called is `invoke(p1: Int)` on `Function1` which is from the stdlib, and therefore no source - // PSI for the function or its parameters. In that case, we use the `@ParameterName` annotation on the parameter type if present - // and fall back to the parameter names from the `invoke()` function (`p1`, `p2`, etc.). - // - // Note: During type resolution, `@ParameterName` type annotations are added based on the names (which are optional) in the - // function type notation. Therefore the `x` parameter in both example functions above have the same type and type annotations. - fir.withFirDeclaration(resolveState, FirResolvePhase.TYPES) { - val parameterNameAnnotation = - fir.returnTypeRef.coneType.attributes.customAnnotations - .getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId) - .singleOrNull()?.safeAs() ?: return@withFirDeclaration defaultName + override val isVararg: Boolean get() = withValidityAssertion { firSymbol.isVararg } - // The parent KtDeclaration is where the variable with functional type and `@ParameterName` annotation is declared. - val parentKtDeclaration = - parameterNameAnnotation.psi?.getNonStrictParentOfType() ?: return@withFirDeclaration defaultName - val parentFirDeclaration = parentKtDeclaration.getOrBuildFirOfType(resolveState) - - // Resolve to ARGUMENTS_OF_ANNOTATIONS phase to get `name` argument from mapping. - val parameterNameFromAnnotation = - parentFirDeclaration.withFirDeclaration(resolveState, FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { - val nameArgument = - parameterNameAnnotation.argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName] - nameArgument?.unwrapArgument()?.safeAs>()?.value as? String - } - parameterNameFromAnnotation?.let { Name.identifier(it) } ?: defaultName - } - } - } - - override val isVararg: Boolean get() = firRef.withFir { it.isVararg } - override val returnType: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir -> - if (fir.isVararg) { + override val returnType by cached { + val returnType = firSymbol.resolvedReturnType + return@cached if (firSymbol.isVararg) { // There SHOULD always be an array element type (even if it is an error type, e.g., unresolved). - val arrayElementType = fir.returnTypeRef.coneType.arrayElementType() - ?: error("No array element type for vararg value parameter: ${fir.renderWithType()}") + val arrayElementType = returnType.arrayElementType() + ?: error("No array element type for vararg value parameter: ${firSymbol.fir.renderWithType()}") builder.typeBuilder.buildKtType(arrayElementType) } else { - firRef.returnType(FirResolvePhase.TYPES, builder) + builder.typeBuilder.buildKtType(returnType) } } - override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null } + override val hasDefaultValue: Boolean get() = withValidityAssertion { firSymbol.hasDefaultValue } - override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) } + override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) } override fun createPointer(): KtSymbolPointer { KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } @@ -110,3 +72,36 @@ internal class KtFirValueParameterSymbol( override fun equals(other: Any?): Boolean = symbolEquals(other) override fun hashCode(): Int = symbolHashCode() } + + +private fun FirValueParameterSymbol.getNameByAnnotation(resolveState: FirModuleResolveState): Name { + val defaultName = fir.name + if (fir.psi != null) return defaultName + + // The case where PSI is null is when calling `invoke()` on a variable with functional type, e.g. `x(1)` below: + // + // fun foo(x: (item: Int) -> Unit) { x(1) } + // fun bar(x: Function1<@ParameterName("item") Int, Unit>) { x(1) } + // + // The function being called is `invoke(p1: Int)` on `Function1` which is from the stdlib, and therefore no source + // PSI for the function or its parameters. In that case, we use the `@ParameterName` annotation on the parameter type if present + // and fall back to the parameter names from the `invoke()` function (`p1`, `p2`, etc.). + // + // Note: During type resolution, `@ParameterName` type annotations are added based on the names (which are optional) in the + // function type notation. Therefore the `x` parameter in both example functions above have the same type and type annotations. + val parameterNameAnnotation = + resolvedReturnType.attributes.customAnnotations + .getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId) + .singleOrNull()?.safeAs() ?: return defaultName + + // The parent KtDeclaration is where the variable with functional type and `@ParameterName` annotation is declared. + val parentKtDeclaration = + parameterNameAnnotation.psi?.getNonStrictParentOfType() ?: return defaultName + val parentFirDeclaration = parentKtDeclaration.getOrBuildFirOfType(resolveState) + + // Resolve to ARGUMENTS_OF_ANNOTATIONS phase to get `name` argument from mapping. + parentFirDeclaration.ensureResolved(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) + val nameArgument = parameterNameAnnotation.argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName] + val parameterNameFromAnnotation = nameArgument?.unwrapArgument()?.safeAs>()?.value as? String + return parameterNameFromAnnotation?.let { Name.identifier(it) } ?: defaultName +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt index 06ef58a6fa8..e111f986939 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/firSymbolUtils.kt @@ -5,47 +5,68 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.Visibility +import org.jetbrains.kotlin.analysis.api.KtInitializerValue +import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder +import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue +import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext import org.jetbrains.kotlin.fir.FirRenderer -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.utils.modality -import org.jetbrains.kotlin.fir.declarations.utils.visibility +import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.renderWithType -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtDeclaration -internal fun KtFirSymbol.getModality( - phase: FirResolvePhase = FirResolvePhase.STATUS, - defaultModality: Modality? = null -): Modality { - return firRef.withFir(phase) { fir -> - fir.modality - ?: defaultModality - ?: fir.invalidModalityError() - } -} -private fun FirDeclaration.invalidModalityError(): Nothing { +internal fun FirCallableSymbol<*>.invalidModalityError(): Nothing { error( """|Symbol modality should not be null, looks like the FIR symbol was not properly resolved | - |${renderWithType(FirRenderer.RenderMode.WithResolvePhases)} + |${fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)} | - |${(psi as? KtDeclaration)?.getElementTextInContext()}""".trimMargin() + |${(fir.psi as? KtDeclaration)?.getElementTextInContext()}""".trimMargin() ) } +internal fun FirFunctionSymbol<*>.createKtValueParameters(builder: KtSymbolByFirBuilder): List { + return fir.valueParameters.map { valueParameter -> + builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter.symbol) + } +} -internal fun KtFirSymbol.getVisibility( - phase: FirResolvePhase = FirResolvePhase.STATUS -): Visibility = - firRef.withFir(phase) { fir -> fir.visibility } +internal fun FirBasedSymbol.createKtTypeParameters( + builder: KtSymbolByFirBuilder +): List where D : FirTypeParameterRefsOwner, D : FirDeclaration { + return fir.typeParameters.map { typeParameter -> + builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol) + } +} -internal fun KtFirSymbol.getCallableIdIfNonLocal(): CallableId? = - firRef.withFir { fir -> fir.symbol.callableId.takeUnless { it.isLocal } } + +internal fun FirCallableSymbol<*>.getCallableIdIfNonLocal(): CallableId? = + callableId.takeUnless { it.isLocal } + +internal fun FirClassLikeSymbol<*>.getClassIdIfNonLocal(): ClassId? = + classId.takeUnless { it.isLocal } + +internal fun FirCallableSymbol<*>.dispatchReceiverType( + builder: KtSymbolByFirBuilder, +): KtType? { + return dispatchReceiverType?.let { builder.typeBuilder.buildKtType(it) } +} + +internal fun FirVariableSymbol<*>.getKtConstantInitializer(): KtInitializerValue? { + ensureResolved(FirResolvePhase.BODY_RESOLVE) + val firInitializer = fir.initializer ?: return null + return firInitializer.asKtInitializerValue() +} diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt index c109e74a6b2..e74cd717195 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirBackingFieldSymbolPointer.kt @@ -21,9 +21,7 @@ internal class KtFirBackingFieldSymbolPointer( @Suppress("DEPRECATION") val propertySymbol = propertySymbolPointer.restoreSymbol(analysisSession) ?: return null check(propertySymbol is KtFirKotlinPropertySymbol) - return propertySymbol.firRef.withFir { firProperty -> - analysisSession.firSymbolBuilder.variableLikeBuilder.buildBackingFieldSymbolByProperty(firProperty) - } + return analysisSession.firSymbolBuilder.variableLikeBuilder.buildBackingFieldSymbolByProperty(propertySymbol.firSymbol) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt index 4bf4f001ca8..58d5d434705 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirConstructorSymbolPointer.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirConstructor import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.name.ClassId @@ -26,7 +26,7 @@ internal class KtFirConstructorSymbolPointer( candidates.findDeclarationWithSignature(signature, firSession) { processDeclaredConstructors(it) } ?: return null if (firConstructor.isPrimary != isPrimary) return null - return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor) + return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor.symbol) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt index e2998a4fd50..8a90039ae9f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirEnumEntrySymbolPointer.kt @@ -5,13 +5,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers -import org.jetbrains.kotlin.descriptors.ClassKind -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.fir.declarations.FirEnumEntry +import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -26,7 +26,7 @@ internal class KtFirEnumEntrySymbolPointer( ?: return null val enumEntry = enumClass.enumEntryByName(name) ?: return null - return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry) + return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry.symbol) } private fun getEnumClass(analysisSession: KtFirAnalysisSession, classId: ClassId): FirRegularClass? { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt index 5f1c336c426..a480d4dc80a 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt @@ -28,6 +28,6 @@ internal class KtFirJavaFieldSymbolPointer( .singleOrNull() ?: return null - return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField) + return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField.symbol) } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt index 915926547f7..35ded29337f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt @@ -28,6 +28,6 @@ internal class KtFirJavaSyntheticPropertySymbolPointer( .singleOrNull() ?: return null - return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty) + return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty.symbol) } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt index b9b0aa2862f..5c6b2a620e7 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberFunctionSymbolPointer.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.scopes.FirScope -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -26,7 +26,7 @@ internal class KtFirMemberFunctionSymbolPointer( val firFunction = candidates.findDeclarationWithSignature(signature, firSession) { processFunctionsByName(name, it) } ?: return null - return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction) + return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt index 45db35d5d65..f3d181aeec5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberPropertySymbolPointer.kt @@ -5,12 +5,11 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirEnumEntry -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name @@ -26,7 +25,7 @@ internal class KtFirMemberPropertySymbolPointer( ): KtKotlinPropertySymbol? { val firProperty = candidates.findDeclarationWithSignature(signature, firSession) { processPropertiesByName(name, it) } ?: return null - return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty) as? KtKotlinPropertySymbol + return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty.symbol) as? KtKotlinPropertySymbol } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt index cf9fdd43324..e00773308d8 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt @@ -5,15 +5,15 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol -import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.ClassId internal abstract class KtFirMemberSymbolPointer( diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt index b68eb4c18db..e1afb1a9d90 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirSamConstructorSymbolPointer.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers -import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer +import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.name.ClassId internal class KtFirSamConstructorSymbolPointer( @@ -19,7 +19,7 @@ internal class KtFirSamConstructorSymbolPointer( override fun restoreSymbol(analysisSession: KtAnalysisSession): KtSamConstructorSymbol? { require(analysisSession is KtFirAnalysisSession) val owner = analysisSession.getClassLikeSymbol(ownerClassId) as? FirRegularClass ?: return null - val classSymbol = analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(owner) + val classSymbol = analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(owner.symbol) with(analysisSession) { return classSymbol.getSamConstructor() } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt index b0ced24d0e8..63c41127436 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirTopLevelFunctionSymbolPointer.kt @@ -5,15 +5,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction -import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.name.CallableId -import org.jetbrains.kotlin.name.ClassId internal class KtFirTopLevelFunctionSymbolPointer( callableId: CallableId, @@ -24,7 +22,7 @@ internal class KtFirTopLevelFunctionSymbolPointer( firSession: FirSession ): KtFunctionSymbol? { val firFunction = candidates.findDeclarationWithSignatureBySymbols(signature, firSession) ?: return null - return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction) + return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt index 678db734a6b..844ebcf693c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/pointerUtils.kt @@ -48,6 +48,9 @@ internal inline fun Collection return null } +internal fun FirBasedSymbol<*>.createSignature(): IdSignature = + fir.createSignature() + internal fun FirDeclaration.createSignature(): IdSignature { val signatureComposer = moduleData.session.ideSessionComponents.signatureComposer return signatureComposer.composeSignature(this) 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 c5f2fa11e33..fa2c0d4b7c4 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 @@ -18,8 +18,6 @@ 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.types.isSuspendFunctionType -import org.jetbrains.kotlin.fir.types.receiverType import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl @@ -132,7 +130,7 @@ internal class KtFirClassErrorType( override val candidateClassSymbols: Collection by cached { val symbols = coneType.diagnostic.getCandidateSymbols().filterIsInstance>() - symbols.map { builder.classifierBuilder.buildClassLikeSymbol(it.fir) } + symbols.map { builder.classifierBuilder.buildClassLikeSymbol(it) } } override fun asStringForDebugging(): String = withValidityAssertion { coneType.render() } 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 deleted file mode 100644 index 760da3556a4..00000000000 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/FirRefWithValidityCheck.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.analysis.api.fir.utils - -import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.api.tokens.assertIsValidAndAccessible -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( - 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() - return fir.withFirDeclaration(resolveState, phase) { action(it) } - } - - /** - * Runs [action] with fir element *without* any lock hold - * Consider using this only when you are completely sure - * that fir or one of it's container already holds the lock (i.e, corresponding withFir call was made) - */ - inline fun withFirUnsafe(action: (fir: D) -> R): R { - token.assertIsValidAndAccessible() - return action(fir) - } - - inline fun withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) = - ValidityAwareCachedValue(token) { - withFir(phase) { fir -> createValue(fir) } - } - - inline fun withFirByType(type: ResolveType, crossinline action: (fir: D) -> R): R { - token.assertIsValidAndAccessible() - return fir.withFirDeclaration(type, resolveState) { action(it) } - } - - inline fun withFirAndCache(type: ResolveType, crossinline createValue: (fir: D) -> R) = - ValidityAwareCachedValue(token) { - withFirByType(type) { fir -> createValue(fir) } - } - - override fun equals(other: Any?): Boolean { - if (other !is FirRefWithValidityCheck<*>) return false - return fir == other.fir && this.token == other.token - } - - override fun hashCode(): Int { - return fir.hashCode() * 31 + token.hashCode() - } - -} - -@Suppress("NOTHING_TO_INLINE") -internal inline fun ValidityTokenOwner.firRef(fir: D, resolveState: FirModuleResolveState) = - FirRefWithValidityCheck(fir, resolveState, token) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/KtAnalysisSessionFe10BindingHolder.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/KtAnalysisSessionFe10BindingHolder.kt index 9ebac680ff5..a067c231217 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/KtAnalysisSessionFe10BindingHolder.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/KtAnalysisSessionFe10BindingHolder.kt @@ -5,11 +5,6 @@ package org.jetbrains.kotlin.analysis.api.fir.utils -import org.jetbrains.kotlin.fir.FirElement -import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration -import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession @@ -20,6 +15,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.psi.KtElement @@ -32,7 +32,7 @@ class KtAnalysisSessionFe10BindingHolder private constructor( val firResolveState: FirModuleResolveState get() = firAnalysisSession.firResolveState fun buildClassLikeSymbol(fir: FirClassLikeDeclaration): KtClassLikeSymbol = - firAnalysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir) + firAnalysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir.symbol) fun buildKtType(coneType: FirTypeRef): KtType = firAnalysisSession.firSymbolBuilder.typeBuilder.buildKtType(coneType) @@ -41,9 +41,9 @@ class KtAnalysisSessionFe10BindingHolder private constructor( @Suppress("UNCHECKED_CAST", "NON_PUBLIC_CALL_FROM_PUBLIC_INLINE") inline fun withFir(ktSymbol: KtSymbol, crossinline action: (T) -> R) = - (ktSymbol as KtFirSymbol).firRef.withFir(action = action) + (ktSymbol as KtFirSymbol<*>).firSymbol.fir.let { action(it as T) } - fun toSignature(ktSymbol: KtSymbol): IdSignature = (ktSymbol as KtFirSymbol<*>).firRef.withFir { it.createSignature() } + fun toSignature(ktSymbol: KtSymbol): IdSignature = (ktSymbol as KtFirSymbol<*>).firSymbol.createSignature() companion object { @InvalidWayOfUsingAnalysisSession diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt index 81cbd11b0af..a8f78fca8f5 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/LazyOnlyWeakRef.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.analysis.api.fir.utils -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import java.lang.ref.WeakReference import kotlin.reflect.KProperty diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt index caedaa93de0..b8581303815 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/ValidityAwareCachedValue.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.analysis.api.fir.utils -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken import org.jetbrains.kotlin.analysis.api.tokens.assertIsValidAndAccessible import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt index ebf5e5cd174..8b00e01f0f9 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/utils/firUtils.kt @@ -9,25 +9,29 @@ import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue import org.jetbrains.kotlin.analysis.api.KtInitializerValue import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator +import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols +import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability +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.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.classKind import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol -import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols -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.types.KtTypeNullability -import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.expressions.FirExpression -import org.jetbrains.kotlin.fir.psi +import org.jetbrains.kotlin.fir.types.ConeClassErrorType +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.ConeNullability +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt index 01440c2ba30..679d64aedd6 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtVariableLikeSymbol.kt @@ -54,6 +54,8 @@ public abstract class KtEnumEntrySymbol : KtVariableLikeSymbol(), KtSymbolWithMe final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER final override val isExtension: Boolean get() = false final override val receiverType: KtType? get() = null + + //todo reduntant, remove public abstract val containingEnumClassIdIfNonLocal: ClassId? abstract override fun createPointer(): KtSymbolPointer diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDeclarationDesignation.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDeclarationDesignation.kt index 45a4d24f6e1..cff4dda2896 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDeclarationDesignation.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/FirDeclarationDesignation.kt @@ -61,7 +61,7 @@ private fun collectDesignationPath(declaration: FirDeclaration): List { + is FirSimpleFunction, is FirProperty, is FirField, is FirConstructor, is FirEnumEntry -> { val klass = declaration.containingClass() ?: return emptyList() if (klass.classId.isLocal) return null @OptIn(LookupTagInternals::class) @@ -90,7 +90,8 @@ fun FirDeclaration.collectDesignation(): FirDeclarationDesignation = tryCollectDesignation() ?: error("No designation of local declaration ${this.render()}") fun FirDeclaration.collectDesignationWithFile(): FirDeclarationDesignationWithFile = - tryCollectDesignationWithFile() ?: error("No designation of local declaration ${this.render()}") + tryCollectDesignationWithFile() + ?: error("No designation of local declaration ${this.render()}") fun FirDeclaration.tryCollectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile? = collectDesignationPath(this)?.let { diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt index 3d82391ccd7..f89a013a5f4 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/InvalidFirElementTypeException.kt @@ -11,33 +11,33 @@ import java.util.* import kotlin.reflect.KClass class InvalidFirElementTypeException( - actualFirClass: KClass?, + actualFirClass: KClass<*>?, ktElement: KtElement?, - expectedFirClasses: List>, + expectedFirClasses: List>, ) : IllegalStateException() { override val message: String = buildString { if (ktElement != null) { append("For $ktElement with text `${ktElement.text}`, ") } val message = when (expectedFirClasses.size) { - 0 -> "Unexpected FirElement of type:" - 1 -> "The FirElement of type ${expectedFirClasses.single()} expected, but" - else -> "One of [${expectedFirClasses.joinToString()}] FirElement types expected, but" + 0 -> "Unexpected element of type:" + 1 -> "The element of type ${expectedFirClasses.single()} expected, but" + else -> "One of [${expectedFirClasses.joinToString()}] element types expected, but" } append(if (ktElement == null) message else message.replaceFirstChar { it.lowercase(Locale.getDefault()) }) if (actualFirClass != null) { append(" ${actualFirClass.simpleName} found") } else { - append(" no FirElement found") + append(" no element found") } } } fun throwUnexpectedFirElementError( - firElement: FirElement?, + firElement: Any?, ktElement: KtElement? = null, - vararg expectedFirClasses: KClass + vararg expectedFirClasses: KClass<*> ): Nothing { throw InvalidFirElementTypeException(firElement?.let { it::class }, ktElement, expectedFirClasses.toList()) } \ No newline at end of file diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt index 4c020e1ae18..5188f6648ae 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/api/LowLevelFirApiFacade.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtFile @@ -43,10 +44,10 @@ fun KtModule.getResolveState(project: Project): FirModuleResolveState = * Otherwise, some threading problems may arise, */ @OptIn(InternalForInline::class) -inline fun KtDeclaration.withFirDeclaration( +inline fun KtDeclaration.withFirSymbol( resolveState: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.RAW_FIR, - action: (FirDeclaration) -> R + action: (FirBasedSymbol<*>) -> R ): R { val firDeclaration = if (getKtModule(project) !is KtSourceModule) { resolveState.findSourceFirCompiledDeclaration(this) @@ -60,7 +61,7 @@ inline fun KtDeclaration.withFirDeclaration( firDeclaration } - return action(resolvedDeclaration) + return action(resolvedDeclaration.symbol) } /** @@ -71,14 +72,14 @@ inline fun KtDeclaration.withFirDeclaration( * Otherwise, some threading problems may arise, */ @OptIn(InternalForInline::class) -inline fun KtDeclaration.withFirDeclaration( +inline fun KtDeclaration.withFirSymbolDeclaration( resolveState: FirModuleResolveState, resolveType: ResolveType = ResolveType.NoResolve, - action: (FirDeclaration) -> R + action: (FirBasedSymbol<*>) -> R ): R { val firDeclaration = resolveState.findSourceFirDeclaration(this) val resolvedDeclaration = firDeclaration.resolvedFirToType(resolveType, resolveState) - return action(resolvedDeclaration) + return action(resolvedDeclaration.symbol) } /** @@ -91,11 +92,11 @@ inline fun KtDeclaration.withFirDeclaration( * Otherwise, some threading problems may arise, */ @OptIn(InternalForInline::class) -inline fun KtDeclaration.withFirDeclarationOfType( +inline fun , R> KtDeclaration.withFirSymbolOfType( resolveState: FirModuleResolveState, phase: FirResolvePhase = FirResolvePhase.RAW_FIR, action: (F) -> R -): R = withFirDeclaration(resolveState, phase) { firDeclaration -> +): R = withFirSymbol(resolveState, phase) { firDeclaration -> if (firDeclaration !is F) throwUnexpectedFirElementError(firDeclaration, this, F::class) action(firDeclaration) } @@ -164,7 +165,7 @@ fun KtFile.collectDiagnosticsForFile( /** * Resolves a given [FirDeclaration] to [phase] and returns resolved declaration * - * Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock + * Should not be called form [withFirSymbol], [withFirDeclarationOfType] functions, as it it may cause deadlock */ fun D.resolvedFirToPhase( phase: FirResolvePhase, @@ -175,7 +176,7 @@ fun D.resolvedFirToPhase( /** * Resolves a given [FirDeclaration] to [phase] and returns resolved declaration * - * Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock + * Should not be called form [withFirSymbol], [withFirDeclarationOfType] functions, as it it may cause deadlock */ fun D.resolvedFirToType( type: ResolveType, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt index 71e95ee5de7..e9470c24044 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/element/builder/FirElementBuilder.kt @@ -129,7 +129,6 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate: && (container.isNonAnonymousClassOrObject() || container is KtDeclarationWithBody || container is KtProperty || container is KtTypeAlias) && container !is KtPrimaryConstructor && declarationCanBeLazilyResolved(container) - && container !is KtEnumEntry && container !is KtFunctionLiteral && container.containingClassOrObject !is KtEnumEntry && predicate(container) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt index 6ea9e79b9f1..b9897a2b84c 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/FirLazyDeclarationResolver.kt @@ -29,6 +29,10 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.providers.firProvider import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtClassBody +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtElement internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBuilder) { /** @@ -291,7 +295,8 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui val nonLocalDeclaration = possiblyLocalDeclaration.getNonLocalContainingOrThisDeclaration() ?: error("Container for local declaration cannot be null") - isLocalDeclarationResolveRequested = possiblyLocalDeclaration != nonLocalDeclaration + isLocalDeclarationResolveRequested = + possiblyLocalDeclaration != nonLocalDeclaration if (isLocalDeclarationResolveRequested && skipLocalDeclaration) return firDeclarationToResolve val nonLocalFirDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration( @@ -428,4 +433,10 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui } } +private fun KtDeclaration.isMemberOfEnumEntry(container: KtDeclaration) : Boolean { + if (container !is KtClass) return false + if (!container.isEnum()) return false + val enumEntryBody = this.parent as? KtClassBody ?: return false + return enumEntryBody.parent == container +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt index be516212dd7..dc83c458cfd 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/utils.kt @@ -92,7 +92,6 @@ internal val FirDeclaration.containingKtFileIfAny: KtFile? internal fun KtDeclaration.isNonAnonymousClassOrObject() = this is KtClassOrObject && !this.isObjectLiteral() - && this !is KtEnumEntry diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt index 437a6e6536f..ea66270055e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.* // ---------------------- callables with status ---------------------- inline val FirCallableSymbol<*>.modality: Modality? get() = resolvedStatus.modality +inline val FirCallableSymbol<*>.modalityOrFinal: Modality get() = modality ?: Modality.FINAL inline val FirCallableSymbol<*>.isAbstract: Boolean get() = resolvedStatus.modality == Modality.ABSTRACT inline val FirCallableSymbol<*>.isOpen: Boolean get() = resolvedStatus.modality == Modality.OPEN inline val FirCallableSymbol<*>.isFinal: Boolean diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt index 76371b16a81..7f367ae27ee 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt @@ -9,7 +9,11 @@ import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.name.ClassId abstract class FirBasedSymbol { private var _fir: E? = null @@ -34,6 +38,18 @@ abstract class FirBasedSymbol { val annotations: List get() = fir.annotations + + val resolvedAnnotationsWithArguments: List + get() { + ensureResolved(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) + return fir.annotations + } + + val resolvedAnnotationClassIds: List + get() { + ensureResolved(FirResolvePhase.TYPES) + return fir.annotations.mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId } + } } @RequiresOptIn diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt index 215f1070d45..6b8b9dfd6fb 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt @@ -21,6 +21,10 @@ abstract class FirCallableSymbol : FirBasedSymbol return fir.returnTypeRef as FirResolvedTypeRef } + val resolvedReturnType: ConeKotlinType + get() = resolvedReturnTypeRef.coneType + + val resolvedReceiverTypeRef: FirResolvedTypeRef? get() { ensureType(fir.receiverTypeRef) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt index d7a7bff4abf..d47d3ca1ad1 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt @@ -10,10 +10,11 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef +import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames sealed class FirClassLikeSymbol( @@ -21,6 +22,8 @@ sealed class FirClassLikeSymbol( ) : FirClassifierSymbol() { abstract override fun toLookupTag(): ConeClassLikeLookupTag + val name get() = classId.shortClassName + val deprecation: DeprecationsPerUseSite? get() { ensureResolved(FirResolvePhase.STATUS) @@ -44,6 +47,9 @@ sealed class FirClassSymbol(classId: ClassId) : FirClassLikeSymbol return fir.superTypeRefs as List } + val resolvedSuperTypes: List + get() = resolvedSuperTypeRefs.map { it.coneType } + val declarationSymbols: List> get() { return fir.declarations.map { it.symbol } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt index 9520601b101..08ae49f001c 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt @@ -105,6 +105,9 @@ class FirAnonymousFunctionSymbol : FirFunctionWithoutNameSymbol(Name.identifier("accessor")) +class FirPropertyAccessorSymbol : FirFunctionWithoutNameSymbol(Name.identifier("accessor")) { + val isGetter: Boolean get() = fir.isGetter + val isSetter: Boolean get() = fir.isSetter +} class FirErrorFunctionSymbol : FirFunctionWithoutNameSymbol(Name.identifier("error")) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt index c6c5d795401..5421a05f1ac 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt @@ -30,6 +30,12 @@ open class FirPropertySymbol( val setterSymbol: FirPropertyAccessorSymbol? get() = fir.setter?.symbol + val backingFieldSymbol: FirBackingFieldSymbol? + get() = fir.backingField?.symbol + + val delegateFieldSymbol: FirDelegateFieldSymbol? + get() = fir.delegateFieldSymbol + val hasInitializer: Boolean get() = fir.initializer != null @@ -61,6 +67,9 @@ class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol