IR: do not use DeepCopyIrTreeWithSymbols in FakeOverrideCopier

#KT-66281
This commit is contained in:
Alexander Udalov
2024-03-05 14:24:38 +01:00
committed by Space Team
parent 09a19d7dbe
commit 41a8b02202
2 changed files with 45 additions and 48 deletions
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.ir.overrides
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrBlockBody import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
@@ -34,7 +32,6 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
private val copier = FakeOverrideCopier( private val copier = FakeOverrideCopier(
symbolRemapper, symbolRemapper,
FakeOverrideTypeRemapper(symbolRemapper, typeArguments), FakeOverrideTypeRemapper(symbolRemapper, typeArguments),
SymbolRenamer.DEFAULT,
parent, parent,
unimplementedOverridesStrategy unimplementedOverridesStrategy
) )
@@ -42,7 +39,11 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
fun copy(): IrOverridableMember { fun copy(): IrOverridableMember {
overridableMember.acceptVoid(symbolRemapper) overridableMember.acceptVoid(symbolRemapper)
val result = overridableMember.transform(copier, null) as IrOverridableMember val result = when (overridableMember) {
is IrSimpleFunction -> copier.copySimpleFunction(overridableMember)
is IrProperty -> copier.copyProperty(overridableMember)
else -> error("Unsupported member: ${overridableMember.render()}")
}
result.patchDeclarationParents(parent) result.patchDeclarationParents(parent)
@@ -89,7 +90,7 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
kotlinType = null kotlinType = null
classifier = symbolRemapper.getReferencedClassifier(type.classifier) classifier = symbolRemapper.getReferencedClassifier(type.classifier)
arguments = remapTypeArguments(type.arguments) arguments = remapTypeArguments(type.arguments)
annotations = type.annotations.memoryOptimizedMap { it.transform(copier, null) as IrConstructorCall } annotations = type.copyAnnotations()
} }
} }
} }
@@ -6,24 +6,24 @@
package org.jetbrains.kotlin.ir.overrides package org.jetbrains.kotlin.ir.overrides
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.SymbolRemapper
import org.jetbrains.kotlin.ir.util.TypeRemapper
import org.jetbrains.kotlin.ir.util.copyAnnotations
class FakeOverrideCopier( internal class FakeOverrideCopier(
private val symbolRemapper: SymbolRemapper, private val symbolRemapper: SymbolRemapper,
private val typeRemapper: TypeRemapper, private val typeRemapper: TypeRemapper,
private val symbolRenamer: SymbolRenamer,
private val parent: IrClass, private val parent: IrClass,
private val unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy private val unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy
) : DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper, symbolRenamer) { ) {
fun copySimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction {
override fun visitSimpleFunction(declaration: IrSimpleFunction): IrSimpleFunction {
val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent) val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent)
return declaration.factory.createFunctionWithLateBinding( return declaration.factory.createFunctionWithLateBinding(
startOffset = parent.startOffset, startOffset = parent.startOffset,
endOffset = parent.endOffset, endOffset = parent.endOffset,
origin = customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE, origin = customization.origin ?: IrDeclarationOrigin.FAKE_OVERRIDE,
name = symbolRenamer.getFunctionName(declaration.symbol), name = declaration.name,
visibility = declaration.visibility, visibility = declaration.visibility,
isInline = declaration.isInline, isInline = declaration.isInline,
isExpect = declaration.isExpect, isExpect = declaration.isExpect,
@@ -36,38 +36,20 @@ class FakeOverrideCopier(
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
).apply { ).apply {
contextReceiverParametersCount = declaration.contextReceiverParametersCount contextReceiverParametersCount = declaration.contextReceiverParametersCount
transformAnnotations(declaration) annotations = declaration.copyAnnotations()
copyTypeParametersFrom(declaration) typeParameters = declaration.typeParameters.map(::copyTypeParameter)
typeRemapper.withinScope(this) { for ((i, thisTypeParameter) in typeParameters.withIndex()) {
// This is the more correct way to produce dispatch receiver for a fake override, val otherTypeParameter = declaration.typeParameters[i]
// but some lowerings still expect the below behavior as produced by the current psi2ir. thisTypeParameter.superTypes = otherTypeParameter.superTypes.map(typeRemapper::remapType)
/*
val superDispatchReceiver = declaration.dispatchReceiverParameter!!
val dispatchReceiverSymbol = IrValueParameterSymbolImpl(WrappedReceiverParameterDescriptor())
val dispatchReceiverType = destinationClass.defaultType
dispatchReceiverParameter = IrValueParameterImpl(
superDispatchReceiver.startOffset,
superDispatchReceiver.endOffset,
superDispatchReceiver.origin,
dispatchReceiverSymbol,
superDispatchReceiver.name,
superDispatchReceiver.index,
dispatchReceiverType,
null,
superDispatchReceiver.isCrossinline,
superDispatchReceiver.isNoinline
)
*/
// Should fake override's receiver be the current class is an open question.
dispatchReceiverParameter = declaration.dispatchReceiverParameter?.transform()
extensionReceiverParameter = declaration.extensionReceiverParameter?.transform()
returnType = typeRemapper.remapType(declaration.returnType)
valueParameters = declaration.valueParameters.transform()
} }
dispatchReceiverParameter = declaration.dispatchReceiverParameter?.let(::copyValueParameter)
extensionReceiverParameter = declaration.extensionReceiverParameter?.let(::copyValueParameter)
returnType = typeRemapper.remapType(declaration.returnType)
valueParameters = declaration.valueParameters.map(::copyValueParameter)
} }
} }
override fun visitProperty(declaration: IrProperty): IrProperty { fun copyProperty(declaration: IrProperty): IrProperty {
val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent) val customization = unimplementedOverridesStrategy.computeCustomization(declaration, parent)
return declaration.factory.createPropertyWithLateBinding( return declaration.factory.createPropertyWithLateBinding(
@@ -83,28 +65,42 @@ class FakeOverrideCopier(
isExpect = declaration.isExpect, isExpect = declaration.isExpect,
isExternal = declaration.isExternal, isExternal = declaration.isExternal,
).apply { ).apply {
transformAnnotations(declaration) annotations = declaration.copyAnnotations()
this.getter = declaration.getter?.transform() this.getter = declaration.getter?.let(::copySimpleFunction)
this.setter = declaration.setter?.transform() this.setter = declaration.setter?.let(::copySimpleFunction)
} }
} }
override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter = private fun copyValueParameter(declaration: IrValueParameter): IrValueParameter =
declaration.factory.createValueParameter( declaration.factory.createValueParameter(
startOffset = parent.startOffset, startOffset = parent.startOffset,
endOffset = parent.endOffset, endOffset = parent.endOffset,
origin = IrDeclarationOrigin.DEFINED, origin = IrDeclarationOrigin.DEFINED,
name = symbolRenamer.getValueParameterName(declaration.symbol), name = declaration.name,
type = declaration.type.remapType(), type = typeRemapper.remapType(declaration.type),
isAssignable = declaration.isAssignable, isAssignable = declaration.isAssignable,
symbol = symbolRemapper.getDeclaredValueParameter(declaration.symbol), symbol = symbolRemapper.getDeclaredValueParameter(declaration.symbol),
index = declaration.index, index = declaration.index,
varargElementType = declaration.varargElementType?.remapType(), varargElementType = declaration.varargElementType?.let(typeRemapper::remapType),
isCrossinline = declaration.isCrossinline, isCrossinline = declaration.isCrossinline,
isNoinline = declaration.isNoinline, isNoinline = declaration.isNoinline,
isHidden = declaration.isHidden, isHidden = declaration.isHidden,
).apply { ).apply {
transformAnnotations(declaration) 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 =
declaration.factory.createTypeParameter(
startOffset = declaration.startOffset,
endOffset = declaration.endOffset,
origin = declaration.origin,
name = declaration.name,
symbol = symbolRemapper.getDeclaredTypeParameter(declaration.symbol),
variance = declaration.variance,
index = declaration.index,
isReified = declaration.isReified,
).apply {
annotations = declaration.copyAnnotations()
}
} }