FIR IDE: extract callable symbol building from KtSymbolByFirBuilder
This commit is contained in:
+1
-1
@@ -138,7 +138,7 @@ private object FirToKtConversionCreator {
|
|||||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
|
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
|
||||||
),
|
),
|
||||||
FirCallableDeclaration::class to HLFunctionCallConversion(
|
FirCallableDeclaration::class to HLFunctionCallConversion(
|
||||||
"firSymbolBuilder.buildCallableSymbol({0} as FirCallableDeclaration)",
|
"firSymbolBuilder.callableBuilder.buildCallableSymbol({0} as FirCallableDeclaration)",
|
||||||
KtCallableSymbol::class.createType(),
|
KtCallableSymbol::class.createType(),
|
||||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration")
|
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration")
|
||||||
),
|
),
|
||||||
|
|||||||
+31
-28
@@ -55,6 +55,7 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
val classifierBuilder = ClassifierSymbolBuilder()
|
val classifierBuilder = ClassifierSymbolBuilder()
|
||||||
val functionLikeBuilder = FunctionLikeSymbolBuilder()
|
val functionLikeBuilder = FunctionLikeSymbolBuilder()
|
||||||
val variableLikeBuilder = VariableLikeSymbolBuilder()
|
val variableLikeBuilder = VariableLikeSymbolBuilder()
|
||||||
|
val callableBuilder = CallableSymbolBuilder()
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
resolveState: FirModuleResolveState,
|
resolveState: FirModuleResolveState,
|
||||||
@@ -89,7 +90,7 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
return when (fir) {
|
return when (fir) {
|
||||||
is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir)
|
is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir)
|
||||||
is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir)
|
is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir)
|
||||||
is FirCallableDeclaration<*> -> buildCallableSymbol(fir)
|
is FirCallableDeclaration<*> -> callableBuilder.buildCallableSymbol(fir)
|
||||||
else -> error("Unexpected ${fir::class.simpleName}")
|
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 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) }
|
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) }
|
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) }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -20,6 +20,6 @@ internal class KtFirExpressionInfoProvider(
|
|||||||
override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? {
|
override fun getReturnExpressionTargetSymbol(returnExpression: KtReturnExpression): KtCallableSymbol? {
|
||||||
val fir = returnExpression.getOrBuildFirSafe<FirReturnExpression>(firResolveState) ?: return null
|
val fir = returnExpression.getOrBuildFirSafe<FirReturnExpression>(firResolveState) ?: return null
|
||||||
val firTargetSymbol = fir.target.labeledElement
|
val firTargetSymbol = fir.target.labeledElement
|
||||||
return firSymbolBuilder.buildCallableSymbol(firTargetSymbol)
|
return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-3
@@ -35,7 +35,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
|||||||
overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement)
|
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> {
|
override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
|
||||||
@@ -45,7 +45,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
|||||||
overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement)
|
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) {
|
private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) {
|
||||||
@@ -134,7 +134,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
|||||||
if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList()
|
if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList()
|
||||||
return symbol.firRef.withFir { fir ->
|
return symbol.firRef.withFir { fir ->
|
||||||
val firSymbol = (fir as? FirSymbolOwner<*>)?.symbol ?: return@withFir emptyList()
|
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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -848,7 +848,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
add(FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE) { firDiagnostic ->
|
add(FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE) { firDiagnostic ->
|
||||||
CannotWeakenAccessPrivilegeImpl(
|
CannotWeakenAccessPrivilegeImpl(
|
||||||
firDiagnostic.a,
|
firDiagnostic.a,
|
||||||
firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration),
|
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration),
|
||||||
firDiagnostic.c,
|
firDiagnostic.c,
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
@@ -857,7 +857,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
add(FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE) { firDiagnostic ->
|
add(FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE) { firDiagnostic ->
|
||||||
CannotChangeAccessPrivilegeImpl(
|
CannotChangeAccessPrivilegeImpl(
|
||||||
firDiagnostic.a,
|
firDiagnostic.a,
|
||||||
firSymbolBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration),
|
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.b as FirCallableDeclaration),
|
||||||
firDiagnostic.c,
|
firDiagnostic.c,
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
@@ -865,7 +865,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
}
|
}
|
||||||
add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic ->
|
add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic ->
|
||||||
OverridingFinalMemberImpl(
|
OverridingFinalMemberImpl(
|
||||||
firSymbolBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration),
|
firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a as FirCallableDeclaration),
|
||||||
firDiagnostic.b,
|
firDiagnostic.b,
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
|
|||||||
+1
-1
@@ -71,7 +71,7 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection<Name>, builde
|
|||||||
firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> {
|
firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> {
|
||||||
builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir)
|
builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir)
|
||||||
}
|
}
|
||||||
else -> builder.buildCallableSymbol(firSymbol.fir)
|
else -> builder.callableBuilder.buildCallableSymbol(firSymbol.fir)
|
||||||
}
|
}
|
||||||
callables.add(symbol)
|
callables.add(symbol)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -74,7 +74,7 @@ internal class KtFirFileScope(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (callableDeclaration != null) {
|
if (callableDeclaration != null) {
|
||||||
yield(builder.buildCallableSymbol(callableDeclaration))
|
yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -88,11 +88,11 @@ internal class KtFirKotlinPropertySymbol(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
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 ->
|
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 }
|
override val hasBackingField: Boolean get() = firRef.withFir { it.hasBackingField }
|
||||||
|
|||||||
+1
-1
@@ -113,7 +113,7 @@ internal class KtFirSymbolProvider(
|
|||||||
|
|
||||||
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
|
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
|
||||||
psi.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(resolveState) {
|
psi.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(resolveState) {
|
||||||
firSymbolBuilder.buildPropertyAccessorSymbol(it)
|
firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -71,11 +71,11 @@ internal class KtFirSyntheticJavaPropertySymbol(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
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 ->
|
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 }
|
override val javaGetterName: Name get() = firRef.withFir { it.getter.delegate.name }
|
||||||
|
|||||||
Reference in New Issue
Block a user