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 newModality = chooseIntersectionOverrideModality(extractedOverrides)
val newVisibility = chooseIntersectionVisibility(extractedOverrides)
val extractedOverridesSymbols = extractedOverrides.map { it.member }
@Suppress("UNCHECKED_CAST")
when (mostSpecific) {
is FirNamedFunctionSymbol -> {
createIntersectionOverride(mostSpecific, newModality, newVisibility)
createIntersectionOverride(mostSpecific, extractedOverridesSymbols, newModality, newVisibility)
}
is FirPropertySymbol -> {
createIntersectionOverride(mostSpecific, newModality, newVisibility)
createIntersectionOverride(mostSpecific, extractedOverridesSymbols, newModality, newVisibility)
}
else -> {
throw IllegalStateException("Should not be here")
@@ -255,16 +256,18 @@ class FirTypeIntersectionScope private constructor(
private fun createIntersectionOverride(
mostSpecific: FirNamedFunctionSymbol,
overrides: Collection<FirCallableSymbol<*>>,
newModality: Modality,
newVisibility: Visibility,
): FirNamedFunctionSymbol {
val newSymbol =
FirNamedFunctionSymbol(
FirIntersectionOverrideFunctionSymbol(
CallableId(
dispatchReceiverType.classId ?: mostSpecific.dispatchReceiverClassOrNull()?.classId!!,
mostSpecific.fir.name
)
),
overrides
)
val mostSpecificFunction = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirFunction(
@@ -282,10 +285,11 @@ class FirTypeIntersectionScope private constructor(
private fun createIntersectionOverride(
mostSpecific: FirPropertySymbol,
overrides: Collection<FirCallableSymbol<*>>,
newModality: Modality,
newVisibility: Visibility,
): FirPropertySymbol {
val newSymbol = FirPropertySymbol(mostSpecific.callableId)
val newSymbol = FirIntersectionOverridePropertySymbol(mostSpecific.callableId, overrides)
val mostSpecificProperty = mostSpecific.fir
FirFakeOverrideGenerator.createCopyForFirProperty(
newSymbol, mostSpecificProperty, mostSpecificProperty.session, FirDeclarationOrigin.IntersectionOverride,
@@ -25,6 +25,11 @@ open class FirNamedFunctionSymbol(
callableId: CallableId,
) : FirFunctionSymbol<FirSimpleFunction>(callableId)
class FirIntersectionOverrideFunctionSymbol(
callableId: CallableId,
val intersections: Collection<FirCallableSymbol<*>>
) : FirNamedFunctionSymbol(callableId)
class FirConstructorSymbol(
callableId: CallableId
) : FirFunctionSymbol<FirConstructor>(callableId)
@@ -27,6 +27,11 @@ open class FirPropertySymbol(
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 FirDelegateFieldSymbol<D : FirVariable<D>>(callableId: CallableId) : FirVariableSymbol<D>(callableId) {