FIR: introduce symbols for intersection override

This commit is contained in:
Ilya Kirillov
2021-01-08 11:24:10 +01:00
parent 2ef8f58d90
commit 95eb701f75
3 changed files with 19 additions and 5 deletions
@@ -105,13 +105,14 @@ class FirTypeIntersectionScope private constructor(
val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) { val intersectionOverride = intersectionOverrides.getOrPut(mostSpecific) {
val newModality = chooseIntersectionOverrideModality(extractedOverrides) val newModality = chooseIntersectionOverrideModality(extractedOverrides)
val newVisibility = chooseIntersectionVisibility(extractedOverrides) val newVisibility = chooseIntersectionVisibility(extractedOverrides)
val extractedOverridesSymbols = extractedOverrides.map { it.member }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
when (mostSpecific) { when (mostSpecific) {
is FirNamedFunctionSymbol -> { is FirNamedFunctionSymbol -> {
createIntersectionOverride(mostSpecific, newModality, newVisibility) createIntersectionOverride(mostSpecific, extractedOverridesSymbols, newModality, newVisibility)
} }
is FirPropertySymbol -> { is FirPropertySymbol -> {
createIntersectionOverride(mostSpecific, newModality, newVisibility) createIntersectionOverride(mostSpecific, extractedOverridesSymbols, newModality, newVisibility)
} }
else -> { else -> {
throw IllegalStateException("Should not be here") throw IllegalStateException("Should not be here")
@@ -255,16 +256,18 @@ class FirTypeIntersectionScope private constructor(
private fun createIntersectionOverride( private fun createIntersectionOverride(
mostSpecific: FirNamedFunctionSymbol, mostSpecific: FirNamedFunctionSymbol,
overrides: Collection<FirCallableSymbol<*>>,
newModality: Modality, newModality: Modality,
newVisibility: Visibility, newVisibility: Visibility,
): FirNamedFunctionSymbol { ): FirNamedFunctionSymbol {
val newSymbol = val newSymbol =
FirNamedFunctionSymbol( FirIntersectionOverrideFunctionSymbol(
CallableId( CallableId(
dispatchReceiverType.classId ?: mostSpecific.dispatchReceiverClassOrNull()?.classId!!, dispatchReceiverType.classId ?: mostSpecific.dispatchReceiverClassOrNull()?.classId!!,
mostSpecific.fir.name mostSpecific.fir.name
) ),
overrides
) )
val mostSpecificFunction = mostSpecific.fir val mostSpecificFunction = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirFunction( FirFakeOverrideGenerator.createCopyForFirFunction(
@@ -282,10 +285,11 @@ class FirTypeIntersectionScope private constructor(
private fun createIntersectionOverride( private fun createIntersectionOverride(
mostSpecific: FirPropertySymbol, mostSpecific: FirPropertySymbol,
overrides: Collection<FirCallableSymbol<*>>,
newModality: Modality, newModality: Modality,
newVisibility: Visibility, newVisibility: Visibility,
): FirPropertySymbol { ): FirPropertySymbol {
val newSymbol = FirPropertySymbol(mostSpecific.callableId) val newSymbol = FirIntersectionOverridePropertySymbol(mostSpecific.callableId, overrides)
val mostSpecificProperty = mostSpecific.fir val mostSpecificProperty = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirProperty( FirFakeOverrideGenerator.createCopyForFirProperty(
newSymbol, mostSpecificProperty, mostSpecificProperty.session, FirDeclarationOrigin.IntersectionOverride, newSymbol, mostSpecificProperty, mostSpecificProperty.session, FirDeclarationOrigin.IntersectionOverride,
@@ -25,6 +25,11 @@ open class FirNamedFunctionSymbol(
callableId: CallableId, callableId: CallableId,
) : FirFunctionSymbol<FirSimpleFunction>(callableId) ) : FirFunctionSymbol<FirSimpleFunction>(callableId)
class FirIntersectionOverrideFunctionSymbol(
callableId: CallableId,
val intersections: Collection<FirCallableSymbol<*>>
) : FirNamedFunctionSymbol(callableId)
class FirConstructorSymbol( class FirConstructorSymbol(
callableId: CallableId callableId: CallableId
) : FirFunctionSymbol<FirConstructor>(callableId) ) : FirFunctionSymbol<FirConstructor>(callableId)
@@ -27,6 +27,11 @@ open class FirPropertySymbol(
constructor(name: Name) : this(@OptIn(LocalCallableIdConstructor::class) CallableId(name)) constructor(name: Name) : this(@OptIn(LocalCallableIdConstructor::class) CallableId(name))
} }
class FirIntersectionOverridePropertySymbol(
callableId: CallableId,
val intersections: Collection<FirCallableSymbol<*>>
) : FirPropertySymbol(callableId)
class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId) class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirProperty>(callableId)
class FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) { class FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) {