FIR2IR: Do not add fake override if the member is overridden

#KT-56398
This commit is contained in:
Ilmir Usmanov
2023-02-22 15:29:44 +01:00
committed by Space Team
parent 5f4a560899
commit 01c670194a
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.backend.common.actualizer package org.jetbrains.kotlin.backend.common.actualizer
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.declarations.buildProperty
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.isAny import org.jetbrains.kotlin.ir.types.isAny
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
@@ -48,6 +48,7 @@ class MissingFakeOverridesAdder(
for (expectMember in expectClass.declarations) { for (expectMember in expectClass.declarations) {
if (expectMember.isBuiltinMember()) continue if (expectMember.isBuiltinMember()) continue
val actualMember = expectActualMap[expectMember.symbol]?.owner as? IrDeclaration ?: continue val actualMember = expectActualMap[expectMember.symbol]?.owner as? IrDeclaration ?: continue
added += actualMember
// Do not add FAKE_OVERRIDE if the subclass already has overridden member // Do not add FAKE_OVERRIDE if the subclass already has overridden member
if (declaration.declarations.filterIsInstance<IrOverridableDeclaration<*>>() if (declaration.declarations.filterIsInstance<IrOverridableDeclaration<*>>()
@@ -56,7 +57,6 @@ class MissingFakeOverridesAdder(
continue continue
} }
addFakeOverride(actualMember, members, declaration) addFakeOverride(actualMember, members, declaration)
added += actualMember
} }
val actualClass = expectActualMap[expectClass.symbol]?.owner as? IrClass ?: continue val actualClass = expectActualMap[expectClass.symbol]?.owner as? IrClass ?: continue
for (actualMember in actualClass.declarations) { for (actualMember in actualClass.declarations) {
@@ -96,65 +96,44 @@ private fun IrDeclaration.isBuiltinMember(): Boolean {
} }
private fun createFakeOverrideProperty(actualMember: IrPropertyImpl, declaration: IrClass) = private fun createFakeOverrideProperty(actualMember: IrPropertyImpl, declaration: IrClass) =
IrPropertyImpl( declaration.factory.buildProperty {
actualMember.startOffset, updateFrom(actualMember)
actualMember.endOffset, name = actualMember.name
IrDeclarationOrigin.FAKE_OVERRIDE, origin = IrDeclarationOrigin.FAKE_OVERRIDE
IrPropertySymbolImpl(), }.apply {
actualMember.name, parent = declaration
actualMember.visibility, annotations = actualMember.annotations
actualMember.modality, backingField = actualMember.backingField
actualMember.isVar, getter = (actualMember.getter as? IrFunctionImpl)?.let { getter ->
actualMember.isConst, createFakeOverrideFunction(getter, declaration, symbol)
actualMember.isLateinit,
actualMember.isDelegated,
isExternal = actualMember.isExternal
).also {
it.parent = declaration
it.annotations = actualMember.annotations
it.backingField = actualMember.backingField
it.getter = (actualMember.getter as? IrFunctionImpl)?.let { getter ->
createFakeOverrideFunction(getter, declaration, it.symbol)
} }
it.setter = (actualMember.setter as? IrFunctionImpl)?.let { setter -> setter = (actualMember.setter as? IrFunctionImpl)?.let { setter ->
createFakeOverrideFunction(setter, declaration, it.symbol) createFakeOverrideFunction(setter, declaration, symbol)
} }
it.overriddenSymbols = listOf(actualMember.symbol) overriddenSymbols = listOf(actualMember.symbol)
it.metadata = actualMember.metadata
it.attributeOwnerId = it
} }
private fun createFakeOverrideFunction( private fun createFakeOverrideFunction(
actualFunction: IrFunctionImpl, actualFunction: IrFunctionImpl,
parent: IrDeclarationParent, parent: IrDeclarationParent,
correspondingPropertySymbol: IrPropertySymbol? = null correspondingPropertySymbol: IrPropertySymbol? = null
) = ) = actualFunction.factory.buildFun {
IrFunctionImpl( updateFrom(actualFunction)
actualFunction.startOffset, name = actualFunction.name
actualFunction.endOffset, returnType = actualFunction.returnType
IrDeclarationOrigin.FAKE_OVERRIDE, origin = IrDeclarationOrigin.FAKE_OVERRIDE
IrSimpleFunctionSymbolImpl(), isFakeOverride = true
actualFunction.name, isExpect = false
actualFunction.visibility, }.also {
actualFunction.modality, it.parent = parent
actualFunction.returnType, it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) }
actualFunction.isInline, it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) }
actualFunction.isExternal, it.dispatchReceiverParameter = actualFunction.dispatchReceiverParameter?.deepCopyWithSymbols(it)
actualFunction.isTailrec, it.extensionReceiverParameter = actualFunction.extensionReceiverParameter?.deepCopyWithSymbols(it)
actualFunction.isSuspend, it.valueParameters = actualFunction.valueParameters.map { p -> p.deepCopyWithSymbols(it) }
actualFunction.isOperator, it.contextReceiverParametersCount = actualFunction.contextReceiverParametersCount
actualFunction.isInfix, it.metadata = actualFunction.metadata
isExpect = false it.overriddenSymbols = listOf(actualFunction.symbol)
).also { it.attributeOwnerId = it
it.parent = parent it.correspondingPropertySymbol = correspondingPropertySymbol
it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) } }
it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) }
it.dispatchReceiverParameter = actualFunction.dispatchReceiverParameter?.deepCopyWithSymbols(it)
it.extensionReceiverParameter = actualFunction.extensionReceiverParameter?.deepCopyWithSymbols(it)
it.valueParameters = actualFunction.valueParameters.map { p -> p.deepCopyWithSymbols(it) }
it.contextReceiverParametersCount = actualFunction.contextReceiverParametersCount
it.metadata = actualFunction.metadata
it.overriddenSymbols = listOf(actualFunction.symbol)
it.attributeOwnerId = it
it.correspondingPropertySymbol = correspondingPropertySymbol
}