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,56 +96,35 @@ 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,
actualFunction.visibility,
actualFunction.modality,
actualFunction.returnType,
actualFunction.isInline,
actualFunction.isExternal,
actualFunction.isTailrec,
actualFunction.isSuspend,
actualFunction.isOperator,
actualFunction.isInfix,
isExpect = false isExpect = false
).also { }.also {
it.parent = parent it.parent = parent
it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) } it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) }
it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) } it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) }
@@ -157,4 +136,4 @@ private fun createFakeOverrideFunction(
it.overriddenSymbols = listOf(actualFunction.symbol) it.overriddenSymbols = listOf(actualFunction.symbol)
it.attributeOwnerId = it it.attributeOwnerId = it
it.correspondingPropertySymbol = correspondingPropertySymbol it.correspondingPropertySymbol = correspondingPropertySymbol
} }