FIR IDE: extract callable symbol building from KtSymbolByFirBuilder

This commit is contained in:
Ilya Kirillov
2021-03-12 19:07:07 +01:00
parent c06bcbad39
commit b6d334b303
10 changed files with 46 additions and 43 deletions
@@ -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")
),
@@ -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) }
}
}
}
@@ -20,6 +20,6 @@ internal class KtFirExpressionInfoProvider(
override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? {
val fir = returnExpression.getOrBuildFirSafe<FirReturnExpression>(firResolveState) ?: return null
val firTargetSymbol = fir.target.labeledElement
return firSymbolBuilder.buildCallableSymbol(firTargetSymbol)
return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol)
}
}
@@ -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 <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
@@ -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) }
}
}
@@ -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,
@@ -71,7 +71,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection<Name>, 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)
}
@@ -74,7 +74,7 @@ internal class KtFirFileScope(
}
if (callableDeclaration != null) {
yield(builder.buildCallableSymbol(callableDeclaration))
yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration))
}
}
}
@@ -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 }
@@ -113,7 +113,7 @@ internal class KtFirSymbolProvider(
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
psi.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(resolveState) {
firSymbolBuilder.buildPropertyAccessorSymbol(it)
firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(it)
}
}
@@ -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 }