[FIR2IR] Fix left usages of symbol.owner in DelegatedMemberGenerator

This commit is contained in:
Dmitriy Novozhilov
2023-11-27 14:32:50 +02:00
committed by Space Team
parent da531bc261
commit 60d77fbb90
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.declarations.utils.modality
import org.jetbrains.kotlin.fir.lazy.Fir2IrLazyClass
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject import org.jetbrains.kotlin.fir.resolve.dfa.cfg.isLocalClassOrAnonymousObject
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.scope import org.jetbrains.kotlin.fir.resolve.scope
@@ -195,26 +196,40 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I
return result return result
} }
@OptIn(UnsafeDuringIrConstructionAPI::class)
fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) { fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) {
val superClasses by lazy(LazyThreadSafetyMode.NONE) { val superClasses by lazy(LazyThreadSafetyMode.NONE) {
irClass.superTypes.mapNotNullTo(mutableSetOf()) { it.classifierOrNull?.owner as? IrClass } irClass.superTypes.mapNotNullTo(mutableSetOf()) {
// All class symbols should be already bound at this moment
@OptIn(UnsafeDuringIrConstructionAPI::class)
it.classifierOrNull?.owner as? IrClass
}
} }
for (declaration in irClass.declarations) {
require(irClass !is Fir2IrLazyClass)
@OptIn(UnsafeDuringIrConstructionAPI::class)
val declarations = irClass.declarations
for (declaration in declarations) {
if (declaration.origin != IrDeclarationOrigin.DELEGATED_MEMBER) continue if (declaration.origin != IrDeclarationOrigin.DELEGATED_MEMBER) continue
when (declaration) { when (declaration) {
is IrSimpleFunction -> { is IrSimpleFunction -> {
val symbol = declaration.symbol
declaration.overriddenSymbols = baseFunctionSymbols[declaration]?.flatMap { declaration.overriddenSymbols = baseFunctionSymbols[declaration]?.flatMap {
fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses) fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)
}?.filter { it.owner != declaration }.orEmpty() }?.filter { it != symbol }.orEmpty()
} }
is IrProperty -> { is IrProperty -> {
val symbol = declaration.symbol
declaration.overriddenSymbols = basePropertySymbols[declaration]?.flatMap { declaration.overriddenSymbols = basePropertySymbols[declaration]?.flatMap {
fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses) fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)
}?.filter { it.owner != declaration }.orEmpty() }?.filter { it != symbol }.orEmpty()
declaration.getter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { it.owner.getter?.symbol } declaration.getter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull {
declarationStorage.findGetterOfProperty(it)
}
if (declaration.isVar) { if (declaration.isVar) {
declaration.setter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { it.owner.setter?.symbol } declaration.setter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull {
declarationStorage.findSetterOfProperty(it)
}
} }
} }
else -> continue else -> continue