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
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.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrPropertyImpl
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
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.isAny
import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols
@@ -48,6 +48,7 @@ class MissingFakeOverridesAdder(
for (expectMember in expectClass.declarations) {
if (expectMember.isBuiltinMember()) continue
val actualMember = expectActualMap[expectMember.symbol]?.owner as? IrDeclaration ?: continue
added += actualMember
// Do not add FAKE_OVERRIDE if the subclass already has overridden member
if (declaration.declarations.filterIsInstance<IrOverridableDeclaration<*>>()
@@ -56,7 +57,6 @@ class MissingFakeOverridesAdder(
continue
}
addFakeOverride(actualMember, members, declaration)
added += actualMember
}
val actualClass = expectActualMap[expectClass.symbol]?.owner as? IrClass ?: continue
for (actualMember in actualClass.declarations) {
@@ -96,65 +96,44 @@ private fun IrDeclaration.isBuiltinMember(): Boolean {
}
private fun createFakeOverrideProperty(actualMember: IrPropertyImpl, declaration: IrClass) =
IrPropertyImpl(
actualMember.startOffset,
actualMember.endOffset,
IrDeclarationOrigin.FAKE_OVERRIDE,
IrPropertySymbolImpl(),
actualMember.name,
actualMember.visibility,
actualMember.modality,
actualMember.isVar,
actualMember.isConst,
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)
declaration.factory.buildProperty {
updateFrom(actualMember)
name = actualMember.name
origin = IrDeclarationOrigin.FAKE_OVERRIDE
}.apply {
parent = declaration
annotations = actualMember.annotations
backingField = actualMember.backingField
getter = (actualMember.getter as? IrFunctionImpl)?.let { getter ->
createFakeOverrideFunction(getter, declaration, symbol)
}
it.setter = (actualMember.setter as? IrFunctionImpl)?.let { setter ->
createFakeOverrideFunction(setter, declaration, it.symbol)
setter = (actualMember.setter as? IrFunctionImpl)?.let { setter ->
createFakeOverrideFunction(setter, declaration, symbol)
}
it.overriddenSymbols = listOf(actualMember.symbol)
it.metadata = actualMember.metadata
it.attributeOwnerId = it
overriddenSymbols = listOf(actualMember.symbol)
}
private fun createFakeOverrideFunction(
actualFunction: IrFunctionImpl,
parent: IrDeclarationParent,
correspondingPropertySymbol: IrPropertySymbol? = null
) =
IrFunctionImpl(
actualFunction.startOffset,
actualFunction.endOffset,
IrDeclarationOrigin.FAKE_OVERRIDE,
IrSimpleFunctionSymbolImpl(),
actualFunction.name,
actualFunction.visibility,
actualFunction.modality,
actualFunction.returnType,
actualFunction.isInline,
actualFunction.isExternal,
actualFunction.isTailrec,
actualFunction.isSuspend,
actualFunction.isOperator,
actualFunction.isInfix,
isExpect = false
).also {
it.parent = parent
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
}
) = actualFunction.factory.buildFun {
updateFrom(actualFunction)
name = actualFunction.name
returnType = actualFunction.returnType
origin = IrDeclarationOrigin.FAKE_OVERRIDE
isFakeOverride = true
isExpect = false
}.also {
it.parent = parent
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
}