IR: remove patchDeclarationParents in FakeOverrideCopier

#KT-66281
This commit is contained in:
Alexander Udalov
2024-03-05 14:37:55 +01:00
committed by Space Team
parent 41a8b02202
commit 79a224cc0f
2 changed files with 21 additions and 21 deletions
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.utils.memoryOptimizedMap
class CopyIrTreeWithSymbolsForFakeOverrides( class CopyIrTreeWithSymbolsForFakeOverrides(
private val overridableMember: IrOverridableMember, private val overridableMember: IrOverridableMember,
typeArguments: Map<IrTypeParameterSymbol, IrType>, typeArguments: Map<IrTypeParameterSymbol, IrType>,
private val parent: IrClass, parentClass: IrClass,
unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy
) { ) {
private val symbolRemapper = FakeOverrideSymbolRemapperImpl(typeArguments, NullDescriptorsRemapper) private val symbolRemapper = FakeOverrideSymbolRemapperImpl(typeArguments, NullDescriptorsRemapper)
@@ -32,22 +32,18 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
private val copier = FakeOverrideCopier( private val copier = FakeOverrideCopier(
symbolRemapper, symbolRemapper,
FakeOverrideTypeRemapper(symbolRemapper, typeArguments), FakeOverrideTypeRemapper(symbolRemapper, typeArguments),
parent, parentClass,
unimplementedOverridesStrategy unimplementedOverridesStrategy
) )
fun copy(): IrOverridableMember { fun copy(): IrOverridableMember {
overridableMember.acceptVoid(symbolRemapper) overridableMember.acceptVoid(symbolRemapper)
val result = when (overridableMember) { return when (overridableMember) {
is IrSimpleFunction -> copier.copySimpleFunction(overridableMember) is IrSimpleFunction -> copier.copySimpleFunction(overridableMember)
is IrProperty -> copier.copyProperty(overridableMember) is IrProperty -> copier.copyProperty(overridableMember)
else -> error("Unsupported member: ${overridableMember.render()}") else -> error("Unsupported member: ${overridableMember.render()}")
} }
result.patchDeclarationParents(parent)
return result
} }
private inner class FakeOverrideTypeRemapper( private inner class FakeOverrideTypeRemapper(
@@ -13,15 +13,15 @@ import org.jetbrains.kotlin.ir.util.copyAnnotations
internal class FakeOverrideCopier( internal class FakeOverrideCopier(
private val symbolRemapper: SymbolRemapper, private val symbolRemapper: SymbolRemapper,
private val typeRemapper: TypeRemapper, private val typeRemapper: TypeRemapper,
private val parent: IrClass, private val parentClass: IrClass,
private val unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy private val unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy
) { ) {
fun copySimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction { fun copySimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent) val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parentClass)
return declaration.factory.createFunctionWithLateBinding( return declaration.factory.createFunctionWithLateBinding(
startOffset = parent.startOffset, startOffset = parentClass.startOffset,
endOffset = parent.endOffset, endOffset = parentClass.endOffset,
origin = customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE, origin = customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE,
name = declaration.name, name = declaration.name,
visibility = declaration.visibility, visibility = declaration.visibility,
@@ -35,25 +35,26 @@ internal class FakeOverrideCopier(
isInfix = declaration.isInfix, isInfix = declaration.isInfix,
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
).apply { ).apply {
parent = parentClass
contextReceiverParametersCount = declaration.contextReceiverParametersCount contextReceiverParametersCount = declaration.contextReceiverParametersCount
annotations = declaration.copyAnnotations() annotations = declaration.copyAnnotations()
typeParameters = declaration.typeParameters.map(::copyTypeParameter) typeParameters = declaration.typeParameters.map { copyTypeParameter(it, this) }
for ((i, thisTypeParameter) in typeParameters.withIndex()) { for ((i, thisTypeParameter) in typeParameters.withIndex()) {
val otherTypeParameter = declaration.typeParameters[i] val otherTypeParameter = declaration.typeParameters[i]
thisTypeParameter.superTypes = otherTypeParameter.superTypes.map(typeRemapper::remapType) thisTypeParameter.superTypes = otherTypeParameter.superTypes.map(typeRemapper::remapType)
} }
dispatchReceiverParameter = declaration.dispatchReceiverParameter?.let(::copyValueParameter) dispatchReceiverParameter = declaration.dispatchReceiverParameter?.let { copyValueParameter(it, this) }
extensionReceiverParameter = declaration.extensionReceiverParameter?.let(::copyValueParameter) extensionReceiverParameter = declaration.extensionReceiverParameter?.let { copyValueParameter(it, this) }
returnType = typeRemapper.remapType(declaration.returnType) returnType = typeRemapper.remapType(declaration.returnType)
valueParameters = declaration.valueParameters.map(::copyValueParameter) valueParameters = declaration.valueParameters.map { copyValueParameter(it, this) }
} }
} }
fun copyProperty(declaration: IrProperty): IrProperty { fun copyProperty(declaration: IrProperty): IrProperty {
val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent) val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parentClass)
return declaration.factory.createPropertyWithLateBinding( return declaration.factory.createPropertyWithLateBinding(
parent.startOffset, parent.endOffset, parentClass.startOffset, parentClass.endOffset,
customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE, customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE,
declaration.name, declaration.name,
declaration.visibility, declaration.visibility,
@@ -65,16 +66,17 @@ internal class FakeOverrideCopier(
isExpect = declaration.isExpect, isExpect = declaration.isExpect,
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
).apply { ).apply {
parent = parentClass
annotations = declaration.copyAnnotations() annotations = declaration.copyAnnotations()
this.getter = declaration.getter?.let(::copySimpleFunction) this.getter = declaration.getter?.let(::copySimpleFunction)
this.setter = declaration.setter?.let(::copySimpleFunction) this.setter = declaration.setter?.let(::copySimpleFunction)
} }
} }
private fun copyValueParameter(declaration: IrValueParameter): IrValueParameter = private fun copyValueParameter(declaration: IrValueParameter, newParent: IrDeclarationParent): IrValueParameter =
declaration.factory.createValueParameter( declaration.factory.createValueParameter(
startOffset = parent.startOffset, startOffset = parentClass.startOffset,
endOffset = parent.endOffset, endOffset = parentClass.endOffset,
origin = IrDeclarationOrigin.DEFINED, origin = IrDeclarationOrigin.DEFINED,
name = declaration.name, name = declaration.name,
type = typeRemapper.remapType(declaration.type), type = typeRemapper.remapType(declaration.type),
@@ -86,11 +88,12 @@ internal class FakeOverrideCopier(
isNoinline = declaration.isNoinline, isNoinline = declaration.isNoinline,
isHidden = declaration.isHidden, isHidden = declaration.isHidden,
).apply { ).apply {
parent = newParent
annotations = declaration.copyAnnotations() annotations = declaration.copyAnnotations()
// Don't set the default value for fake overrides. // Don't set the default value for fake overrides.
} }
private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter = private fun copyTypeParameter(declaration: IrTypeParameter, newParent: IrDeclarationParent): IrTypeParameter =
declaration.factory.createTypeParameter( declaration.factory.createTypeParameter(
startOffset = declaration.startOffset, startOffset = declaration.startOffset,
endOffset = declaration.endOffset, endOffset = declaration.endOffset,
@@ -101,6 +104,7 @@ internal class FakeOverrideCopier(
index = declaration.index, index = declaration.index,
isReified = declaration.isReified, isReified = declaration.isReified,
).apply { ).apply {
parent = newParent
annotations = declaration.copyAnnotations() annotations = declaration.copyAnnotations()
} }
} }