IR: remove patchDeclarationParents in FakeOverrideCopier
#KT-66281
This commit is contained in:
committed by
Space Team
parent
41a8b02202
commit
79a224cc0f
+3
-7
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user