FIR2IR: Do not add fake override if the member is overridden
#KT-56398
This commit is contained in:
committed by
Space Team
parent
5f4a560899
commit
01c670194a
+36
-57
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user