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 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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user