From 439e54aee6f2eb2709e2109b095431b04a292079 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 12 Mar 2021 15:28:48 +0100 Subject: [PATCH] FIR IDE: extract class-like symbol building to separate class --- .../fir/generator/HLDiagnosticConverter.kt | 6 +- .../frontend/api/fir/KtSymbolByFirBuilder.kt | 115 ++++++++++-------- .../diagnostics/KtFirDataClassConverters.kt | 6 +- .../api/fir/scopes/KtFirDelegatingScope.kt | 2 +- .../frontend/api/fir/scopes/KtFirFileScope.kt | 2 +- .../api/fir/symbols/KtFirConstructorSymbol.kt | 2 +- .../api/fir/symbols/KtFirFunctionSymbol.kt | 2 +- .../symbols/KtFirNamedClassOrObjectSymbol.kt | 4 +- .../api/fir/symbols/KtFirSymbolProvider.kt | 12 +- ...tFirClassOrObjectInLibrarySymbolPointer.kt | 5 +- .../pointers/KtFirMemberSymbolPointer.kt | 10 +- .../idea/frontend/api/fir/types/FirKtType.kt | 8 +- 12 files changed, 96 insertions(+), 78 deletions(-) diff --git a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt index 2083bc7e944..7ffc2663f2a 100644 --- a/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt +++ b/idea/idea-frontend-fir/idea-frontend-fir-generator/src/org/jetbrains/kotlin/idea/frontend/api/fir/generator/HLDiagnosticConverter.kt @@ -116,7 +116,7 @@ private object FirToKtConversionCreator { importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") ), FirClass::class to HLFunctionCallConversion( - "firSymbolBuilder.buildClassLikeSymbol({0})", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})", KtClassLikeSymbol::class.createType() ), FirExpression::class to HLFunctionCallConversion( @@ -128,7 +128,7 @@ private object FirToKtConversionCreator { ) ), FirClassLikeSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)", + "firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)", KtClassLikeSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirClass") ), @@ -143,7 +143,7 @@ private object FirToKtConversionCreator { importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration") ), FirTypeParameterSymbol::class to HLFunctionCallConversion( - "firSymbolBuilder.buildTypeParameterSymbol({0}.fir)", + "firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)", KtTypeParameterSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter") ), diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt index a21b9644083..5b875838bbb 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/KtSymbolByFirBuilder.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir import com.google.common.collect.MapMaker import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* @@ -53,6 +52,7 @@ internal class KtSymbolByFirBuilder private constructor( private val firProvider get() = resolveState.rootModuleSession.symbolProvider val rootSession: FirSession = resolveState.rootModuleSession + val classifierBuilder = ClassifierSymbolBuilder() constructor( resolveState: FirModuleResolveState, @@ -85,12 +85,12 @@ internal class KtSymbolByFirBuilder private constructor( fun buildSymbol(fir: FirDeclaration): KtSymbol { return when (fir) { - is FirClassLikeDeclaration<*> -> buildClassLikeSymbol(fir) + is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir) + is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir) is FirSimpleFunction -> buildFunctionSymbol(fir) is FirProperty -> buildVariableSymbol(fir) is FirValueParameter -> buildParameterSymbol(fir) is FirConstructor -> buildConstructorSymbol(fir) - is FirTypeParameter -> buildTypeParameterSymbol(fir) is FirEnumEntry -> buildEnumEntrySymbol(fir) is FirField -> buildFieldSymbol(fir) is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir) @@ -105,43 +105,12 @@ internal class KtSymbolByFirBuilder private constructor( fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol - fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol { - return when (fir) { - is FirClass<*> -> buildClassOrObjectSymbol(fir) - is FirTypeAlias -> buildTypeAliasSymbol(fir) - else -> error("Unexpected ${fir::class.simpleName}") - } - } - - fun buildClassOrObjectSymbol(fir: FirClass<*>): KtClassOrObjectSymbol { - return when (fir) { - is FirAnonymousObject -> buildAnonymousObjectSymbol(fir) - is FirRegularClass -> buildNamedClassOrObjectSymbol(fir) - else -> error("Unexpected ${fir::class.simpleName}") - } - } - - fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol { - return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this) } - } - - fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol { - return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this) } - } - - fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol = when (val fir = firSymbol.fir) { - is FirClassLikeDeclaration -> buildClassLikeSymbol(fir) - is FirTypeParameter -> buildTypeParameterSymbol(fir) - else -> - TODO(fir::class.toString()) - } - - // TODO it can be a constructor parameter, which may be split into parameter & property // we should handle them both fun buildParameterSymbol(fir: FirValueParameter) = symbolsCache.cache(fir) { KtFirFunctionValueParameterSymbol(fir, resolveState, token, this) } + fun buildFirConstructorParameter(fir: FirValueParameter) = symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this) } @@ -153,11 +122,8 @@ internal class KtSymbolByFirBuilder private constructor( val originalFir = fir.originalConstructorIfTypeAlias ?: fir return symbolsCache.cache(originalFir) { KtFirConstructorSymbol(originalFir, resolveState, token, this) } } - fun buildTypeParameterSymbol(fir: FirTypeParameter) = - symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this) } - fun buildTypeAliasSymbol(fir: FirTypeAlias) = symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token) } - fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) } + fun buildFieldSymbol(fir: FirField) = symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this) } fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction) = symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this) } @@ -179,17 +145,6 @@ internal class KtSymbolByFirBuilder private constructor( } } - fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? = withValidityAssertion { - firProvider.getSymbolByLookupTag(lookupTag)?.fir?.let(::buildClassLikeSymbol) - } - - fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? = withValidityAssertion { - (firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol)?.fir?.let(::buildTypeParameterSymbol) - } - - fun buildClassLikeSymbolByClassId(classId: ClassId): FirRegularClass? = withValidityAssertion { - firProvider.getClassLikeSymbolByFqName(classId)?.fir as? FirRegularClass - } fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? { @@ -236,8 +191,68 @@ internal class KtSymbolByFirBuilder private constructor( else -> TODO(coneType::class.toString()) } } + + inner class ClassifierSymbolBuilder { + fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol { + return when (val fir = firSymbol.fir) { + is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir) + is FirTypeParameter -> buildTypeParameterSymbol(fir) + else -> error("Unexpected ${fir::class.simpleName}") + } + } + + + fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol { + return when (fir) { + is FirClass<*> -> buildClassOrObjectSymbol(fir) + is FirTypeAlias -> buildTypeAliasSymbol(fir) + else -> error("Unexpected ${fir::class.simpleName}") + } + } + + fun buildClassOrObjectSymbol(fir: FirClass<*>): KtClassOrObjectSymbol { + return when (fir) { + is FirAnonymousObject -> buildAnonymousObjectSymbol(fir) + is FirRegularClass -> buildNamedClassOrObjectSymbol(fir) + else -> error("Unexpected ${fir::class.simpleName}") + } + } + + fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol { + return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol { + return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildTypeAliasSymbol(fir: FirTypeAlias): KtFirTypeAliasSymbol { + return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token) } + } + + fun buildTypeParameterSymbol(fir: FirTypeParameter): KtFirTypeParameterSymbol { + return symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? { + val firTypeParameterSymbol = firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol ?: return null + return buildTypeParameterSymbol(firTypeParameterSymbol.fir) + } + + fun buildClassLikeSymbolByClassId(classId: ClassId): KtClassLikeSymbol? { + val firClassLikeSymbol = firProvider.getClassLikeSymbolByFqName(classId) ?: return null + return buildClassLikeSymbol(firClassLikeSymbol.fir) + } + + fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? { + val firClassLikeSymbol = firProvider.getSymbolByLookupTag(lookupTag) ?: return null + return buildClassLikeSymbol(firClassLikeSymbol.fir) + } + } + } + private class BuilderCache private constructor( private val cache: ConcurrentMap, private val isReadOnly: Boolean diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index ab1feebc84c..58c8517a3dc 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -216,7 +216,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE) { firDiagnostic -> QualifiedSupertypeExtendedByOtherSupertypeImpl( - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a), firDiagnostic as FirPsiDiagnostic<*>, token, ) @@ -718,7 +718,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.UPPER_BOUND_VIOLATED) { firDiagnostic -> UpperBoundViolatedImpl( - firSymbolBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir), firSymbolBuilder.buildKtType(firDiagnostic.b), firDiagnostic as FirPsiDiagnostic<*>, token, @@ -733,7 +733,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS) { firDiagnostic -> WrongNumberOfTypeArgumentsImpl( firDiagnostic.a, - firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass<*>), + firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass<*>), firDiagnostic as FirPsiDiagnostic<*>, token, ) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt index be977b93464..c87b9e12a3d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirDelegatingScope.kt @@ -84,7 +84,7 @@ internal fun FirScope.getClassifierSymbols(classLikeNames: Collection, bui classLikeNames.forEach { name -> val classifierSymbols = mutableListOf() processClassifiersByName(name) { firSymbol -> - classifierSymbols.add(builder.buildClassifierSymbol(firSymbol)) + classifierSymbols.add(builder.classifierBuilder.buildClassifierSymbol(firSymbol)) } yieldAll(classifierSymbols) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirFileScope.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirFileScope.kt index 606de3f4e40..6fd96627efd 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirFileScope.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/scopes/KtFirFileScope.kt @@ -87,7 +87,7 @@ internal class KtFirFileScope( it.declarations.forEach { firDeclaration -> val classLikeDeclaration = (firDeclaration as? FirRegularClass)?.takeIf { klass -> nameFilter(klass.name) } if (classLikeDeclaration != null) { - yield(builder.buildClassLikeSymbol(classLikeDeclaration)) + yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration)) } } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt index 250e44b0893..80789d8400f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirConstructorSymbol.kt @@ -67,7 +67,7 @@ internal class KtFirConstructorSymbol( override val typeParameters by firRef.withFirAndCache { fir -> fir.typeParameters.map { typeParameter -> - builder.buildTypeParameterSymbol(typeParameter.symbol.fir) + builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index 43ed88bf99d..50e1f99f3db 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -50,7 +50,7 @@ internal class KtFirFunctionSymbol( } override val typeParameters by firRef.withFirAndCache { fir -> fir.typeParameters.map { typeParameter -> - builder.buildTypeParameterSymbol(typeParameter.symbol.fir) + builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt index 5a2cbd6c96c..3937d9e74b2 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirNamedClassOrObjectSymbol.kt @@ -59,7 +59,7 @@ internal class KtFirNamedClassOrObjectSymbol( override val isExternal: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isExternal } override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir -> - fir.companionObject?.let { builder.buildNamedClassOrObjectSymbol(it) } + fir.companionObject?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it) } } override val superTypes: List by cached { @@ -68,7 +68,7 @@ internal class KtFirNamedClassOrObjectSymbol( override val typeParameters by firRef.withFirAndCache { fir -> fir.typeParameters.map { typeParameter -> - builder.buildTypeParameterSymbol(typeParameter.symbol.fir) + builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt index 35211846d52..c668bd8024e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSymbolProvider.kt @@ -57,13 +57,13 @@ internal class KtFirSymbolProvider( override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildTypeParameterSymbol(it) + firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(it) } } override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildTypeAliasSymbol(it) + firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(it) } } @@ -94,20 +94,20 @@ internal class KtFirSymbolProvider( override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion { psi.objectDeclaration.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildAnonymousObjectSymbol(it) + firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol(it) } } override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { psi.withFirDeclarationOfType, KtClassOrObjectSymbol>(resolveState) { - firSymbolBuilder.buildClassOrObjectSymbol(it) + firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(it) } } override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol = withValidityAssertion { require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression) psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildNamedClassOrObjectSymbol(it) + firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it) } } @@ -119,7 +119,7 @@ internal class KtFirSymbolProvider( override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { val symbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null - firSymbolBuilder.buildNamedClassOrObjectSymbol(symbol.fir) + firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol.fir) } override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirClassOrObjectInLibrarySymbolPointer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirClassOrObjectInLibrarySymbolPointer.kt index af165e501fb..ac4ebfb84b4 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirClassOrObjectInLibrarySymbolPointer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirClassOrObjectInLibrarySymbolPointer.kt @@ -7,8 +7,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol -import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.name.ClassId @@ -16,7 +14,6 @@ import org.jetbrains.kotlin.name.ClassId class KtFirClassOrObjectInLibrarySymbolPointer(private val classId: ClassId) : KtSymbolPointer() { override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? { require(analysisSession is KtFirAnalysisSession) - val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(classId) ?: return null - return analysisSession.firSymbolBuilder.buildNamedClassOrObjectSymbol(firClass) + return analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbolByClassId(classId) as? KtNamedClassOrObjectSymbol } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt index 8a810b12653..78926998d22 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/pointers/KtFirMemberSymbolPointer.kt @@ -7,6 +7,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol @@ -18,9 +20,8 @@ internal abstract class KtFirMemberSymbolPointer( ) : KtSymbolPointer() { final override fun restoreSymbol(analysisSession: KtAnalysisSession): S? { require(analysisSession is KtFirAnalysisSession) - val owner = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId( - ownerClassId - ) ?: return null + val owner = analysisSession.getClassLikeSymbol(ownerClassId) as? FirRegularClass + ?: return null return analysisSession.chooseCandidateAndCreateSymbol(owner.declarations, owner.session) } @@ -30,3 +31,6 @@ internal abstract class KtFirMemberSymbolPointer( ): S? } +private fun KtFirAnalysisSession.getClassLikeSymbol(classId: ClassId) = + firResolveState.rootModuleSession.symbolProvider.getClassLikeSymbolByFqName(classId)?.fir + diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/types/FirKtType.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/types/FirKtType.kt index c7a78758424..bab1064072b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/types/FirKtType.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/types/FirKtType.kt @@ -34,7 +34,8 @@ internal class KtFirUsualClassType( override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId } override val classSymbol: KtClassLikeSymbol by cached { - firBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) ?: error("Class ${coneType.lookupTag} was not found") + firBuilder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) + ?: error("Class ${coneType.lookupTag} was not found") } override val typeArguments: List by cached { coneType.typeArguments.map { typeArgument -> @@ -58,7 +59,8 @@ internal class KtFirFunctionalType( override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId } override val classSymbol: KtClassLikeSymbol by cached { - firBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) ?: error("Class ${coneType.lookupTag} was not found") + firBuilder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) + ?: error("Class ${coneType.lookupTag} was not found") } override val typeArguments: List by cached { coneType.typeArguments.map { typeArgument -> @@ -113,7 +115,7 @@ internal class KtFirTypeParameterType( override val name: Name get() = withValidityAssertion { coneType.lookupTag.name } override val symbol: KtTypeParameterSymbol by cached { - firBuilder.buildTypeParameterSymbolByLookupTag(coneType.lookupTag) + firBuilder.classifierBuilder.buildTypeParameterSymbolByLookupTag(coneType.lookupTag) ?: error("Type parameter ${coneType.lookupTag} was not found") }