From b6d334b3039ee8bbe145244692aeff6de72c44c9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 12 Mar 2021 19:07:07 +0100 Subject: [PATCH] FIR IDE: extract callable symbol building from KtSymbolByFirBuilder --- .../fir/generator/HLDiagnosticConverter.kt | 2 +- .../frontend/api/fir/KtSymbolByFirBuilder.kt | 59 ++++++++++--------- .../components/KtFirExpressionInfoProvider.kt | 2 +- ...KtFirSymbolDeclarationOverridesProvider.kt | 6 +- .../diagnostics/KtFirDataClassConverters.kt | 6 +- .../api/fir/scopes/KtFirDelegatingScope.kt | 2 +- .../frontend/api/fir/scopes/KtFirFileScope.kt | 2 +- .../fir/symbols/KtFirKotlinPropertySymbol.kt | 4 +- .../api/fir/symbols/KtFirSymbolProvider.kt | 2 +- .../KtFirSyntheticJavaPropertySymbol.kt | 4 +- 10 files changed, 46 insertions(+), 43 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 dcd9b19457e..0ab6cca2970 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 @@ -138,7 +138,7 @@ private object FirToKtConversionCreator { importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration") ), FirCallableDeclaration::class to HLFunctionCallConversion( - "firSymbolBuilder.buildCallableSymbol({0} as FirCallableDeclaration)", + "firSymbolBuilder.callableBuilder.buildCallableSymbol({0} as FirCallableDeclaration)", KtCallableSymbol::class.createType(), importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration") ), 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 cd7130fd0a4..d9f5385c032 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 @@ -55,6 +55,7 @@ internal class KtSymbolByFirBuilder private constructor( val classifierBuilder = ClassifierSymbolBuilder() val functionLikeBuilder = FunctionLikeSymbolBuilder() val variableLikeBuilder = VariableLikeSymbolBuilder() + val callableBuilder = CallableSymbolBuilder() constructor( resolveState: FirModuleResolveState, @@ -89,7 +90,7 @@ internal class KtSymbolByFirBuilder private constructor( return when (fir) { is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir) is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir) - is FirCallableDeclaration<*> -> buildCallableSymbol(fir) + is FirCallableDeclaration<*> -> callableBuilder.buildCallableSymbol(fir) else -> error("Unexpected ${fir::class.simpleName}") } } @@ -98,33 +99,6 @@ internal class KtSymbolByFirBuilder private constructor( fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) } - fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol { - return when (fir) { - is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) - is FirFunction<*> -> functionLikeSymbolBuilder.buildFunctionLikeSymbol(fir) - is FirVariable<*> -> variableLikeSymbolBuilder.buildVariableLikeSymbol(fir) - else -> error("Unexpected ${fir::class.simpleName}") - } - } - - - fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtPropertyAccessorSymbol { - return when { - fir.isGetter -> buildGetterSymbol(fir) - else -> buildSetterSymbol(fir) - } - } - - fun buildGetterSymbol(fir: FirPropertyAccessor): KtFirPropertyGetterSymbol { - require(fir.isGetter) - return symbolsCache.cache(fir) { KtFirPropertyGetterSymbol(fir, resolveState, token, this) } - } - - fun buildSetterSymbol(fir: FirPropertyAccessor): KtFirPropertySetterSymbol { - require(fir.isSetter) - return symbolsCache.cache(fir) { KtFirPropertySetterSymbol(fir, resolveState, token, this) } - } - fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) } @@ -303,6 +277,35 @@ internal class KtSymbolByFirBuilder private constructor( return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } } } + + 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 -> error("Unexpected ${fir::class.simpleName}") + } + } + + + fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtPropertyAccessorSymbol { + return when { + fir.isGetter -> buildGetterSymbol(fir) + else -> buildSetterSymbol(fir) + } + } + + fun buildGetterSymbol(fir: FirPropertyAccessor): KtFirPropertyGetterSymbol { + require(fir.isGetter) + return symbolsCache.cache(fir) { KtFirPropertyGetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + + fun buildSetterSymbol(fir: FirPropertyAccessor): KtFirPropertySetterSymbol { + require(fir.isSetter) + return symbolsCache.cache(fir) { KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } + } + } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionInfoProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionInfoProvider.kt index 7fdb4052891..b61b59a8167 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionInfoProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirExpressionInfoProvider.kt @@ -20,6 +20,6 @@ internal class KtFirExpressionInfoProvider( override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? { val fir = returnExpression.getOrBuildFirSafe(firResolveState) ?: return null val firTargetSymbol = fir.target.labeledElement - return firSymbolBuilder.buildCallableSymbol(firTargetSymbol) + return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol) } } \ No newline at end of file diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index 2c626bc785b..2d202f04a20 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -35,7 +35,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.buildCallableSymbol(it.fir) } + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } } override fun getDirectlyOverriddenSymbols(callableSymbol: T): List { @@ -45,7 +45,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement) } } - return overriddenElement.map { analysisSession.firSymbolBuilder.buildCallableSymbol(it.fir) } + return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } } private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) { @@ -134,7 +134,7 @@ internal class KtFirSymbolDeclarationOverridesProvider( if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList() return symbol.firRef.withFir { fir -> val firSymbol = (fir as? FirSymbolOwner<*>)?.symbol ?: return@withFir emptyList() - firSymbol.getIntersectionOverriddenSymbols().map { analysisSession.firSymbolBuilder.buildCallableSymbol(it.fir) } + firSymbol.getIntersectionOverriddenSymbols().map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) } } } 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 822dd9b5dfb..3b3c4aa50f6 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 @@ -848,7 +848,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE) { firDiagnostic -> CannotWeakenAccessPrivilegeImpl( firDiagnostic.a, - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic.c, firDiagnostic as FirPsiDiagnostic<*>, token, @@ -857,7 +857,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert add(FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE) { firDiagnostic -> CannotChangeAccessPrivilegeImpl( firDiagnostic.a, - firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration), firDiagnostic.c, firDiagnostic as FirPsiDiagnostic<*>, token, @@ -865,7 +865,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic -> OverridingFinalMemberImpl( - firSymbolBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration), + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration), firDiagnostic.b, 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 f5dc89000bc..da1504e2dc0 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 @@ -71,7 +71,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection, builde firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> { builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir) } - else -> builder.buildCallableSymbol(firSymbol.fir) + else -> builder.callableBuilder.buildCallableSymbol(firSymbol.fir) } callables.add(symbol) } 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 6fd96627efd..e376cd00f90 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 @@ -74,7 +74,7 @@ internal class KtFirFileScope( } if (callableDeclaration != null) { - yield(builder.buildCallableSymbol(callableDeclaration)) + yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration)) } } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index 7ef45e945b0..ddc4f0d7d23 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -88,11 +88,11 @@ internal class KtFirKotlinPropertySymbol( } override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.getter?.let { builder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol + property.getter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol } override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.setter?.let { builder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol + property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol } override val hasBackingField: Boolean get() = firRef.withFir { it.hasBackingField } 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 2d78542e443..1fddb6e3275 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 @@ -113,7 +113,7 @@ internal class KtFirSymbolProvider( override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion { psi.withFirDeclarationOfType(resolveState) { - firSymbolBuilder.buildPropertyAccessorSymbol(it) + firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(it) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index a5c0a3b95a0..177f86be544 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -71,11 +71,11 @@ internal class KtFirSyntheticJavaPropertySymbol( } override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.getter.let { builder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol + property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol } override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property -> - property.setter?.let { builder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol + property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol } override val javaGetterName: Name get() = firRef.withFir { it.getter.delegate.name }