FIR: introduce symbols for intersection override
This commit is contained in:
+9
-5
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user