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
|
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
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user