From 01c670194a3b923fffed333ec33dc0e9c8d8dbac Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 22 Feb 2023 15:29:44 +0100 Subject: [PATCH] FIR2IR: Do not add fake override if the member is overridden #KT-56398 --- .../actualizer/MissingFakeOverridesAdder.kt | 93 +++++++------------ 1 file changed, 36 insertions(+), 57 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt index 2ba3eaa826f..186c3497edc 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/MissingFakeOverridesAdder.kt @@ -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>() @@ -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 - } \ No newline at end of file +) = 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 +} \ No newline at end of file