From 60d77fbb90e1b766191e72cf2d4bd64e3ab6655b Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 27 Nov 2023 14:32:50 +0200 Subject: [PATCH] [FIR2IR] Fix left usages of `symbol.owner` in DelegatedMemberGenerator --- .../generators/DelegatedMemberGenerator.kt | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt index 8366985b807..47f8d53815e 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DelegatedMemberGenerator.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.declarations.* 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.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.scope @@ -195,26 +196,40 @@ class DelegatedMemberGenerator(private val components: Fir2IrComponents) : Fir2I return result } - @OptIn(UnsafeDuringIrConstructionAPI::class) fun bindDelegatedMembersOverriddenSymbols(irClass: IrClass) { 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 when (declaration) { is IrSimpleFunction -> { + val symbol = declaration.symbol declaration.overriddenSymbols = baseFunctionSymbols[declaration]?.flatMap { fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses) - }?.filter { it.owner != declaration }.orEmpty() + }?.filter { it != symbol }.orEmpty() } is IrProperty -> { + val symbol = declaration.symbol declaration.overriddenSymbols = basePropertySymbols[declaration]?.flatMap { fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses) - }?.filter { it.owner != declaration }.orEmpty() - declaration.getter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { it.owner.getter?.symbol } + }?.filter { it != symbol }.orEmpty() + declaration.getter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { + declarationStorage.findGetterOfProperty(it) + } if (declaration.isVar) { - declaration.setter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { it.owner.setter?.symbol } + declaration.setter!!.overriddenSymbols = declaration.overriddenSymbols.mapNotNull { + declarationStorage.findSetterOfProperty(it) + } } } else -> continue