From 8f97f15b86673af7a91d6b1b906e3ca22b5b5f2f Mon Sep 17 00:00:00 2001 From: Pavel Shishkin Date: Mon, 15 Apr 2024 14:22:41 +0200 Subject: [PATCH] compose-compiler: fix typeparam remapping fixes https://github.com/JetBrains/compose-multiplatform/issues/3147 there is a bug on all platforms related to incorrect `IrTypeParameterSymbol` remapping during function body transformation because of `copyWithNewTypeParams` is called on function body directly, it doesn't accumulate typeparam symbols mapping (located in signature), which leads to preserving old symbols during body transformation Test: tested against Compose Multiplatform testsuite Change-Id: If813824a3387e78910670174bd6aabe7d13e2d43 ( https://android-review.googlesource.com/q/If813824a3387e78910670174bd6aabe7d13e2d43 ) Signed-off-by: Pavel Shishkin Moved from: https://github.com/androidx/androidx/commit/faae2fb90cd0c1dd1b9bfa8c85a1f0e077795a2f --- .../kotlin/lower/decoys/DecoyTransformBase.kt | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt index 12ac527c297cd..a54d51833743c 100644 --- a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt +++ b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/decoys/DecoyTransformBase.kt @@ -43,16 +43,9 @@ import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrTypeArgument import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl -import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper -import org.jetbrains.kotlin.ir.util.IdSignature -import org.jetbrains.kotlin.ir.util.SymbolRenamer -import org.jetbrains.kotlin.ir.util.TypeRemapper -import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols -import org.jetbrains.kotlin.ir.util.getAnnotation -import org.jetbrains.kotlin.ir.util.isTopLevel -import org.jetbrains.kotlin.ir.util.module -import org.jetbrains.kotlin.ir.util.remapTypeParameters -import org.jetbrains.kotlin.ir.util.toIrConst +import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.acceptVoid @JvmDefaultWithCompatibility internal interface DecoyTransformBase { @@ -209,19 +202,28 @@ internal inline fun T.copyWithNewTypeParams( source: IrFunction, target: IrFunction ): T { - @Suppress("DEPRECATION") - return deepCopyWithSymbols(target) { symbolRemapper, typeRemapper -> - val typeParamRemapper = object : TypeRemapper by typeRemapper { - override fun remapType(type: IrType): IrType { - return typeRemapper.remapType(type.remapTypeParameters(source, target)) + val typeParamsAwareSymbolRemapper = object : DeepCopySymbolRemapper() { + init { + for ((orig, new) in source.typeParameters.zip(target.typeParameters)) { + typeParameters[orig.symbol] = new.symbol } } - val deepCopy = DeepCopyPreservingMetadata( - symbolRemapper, - typeParamRemapper, - SymbolRenamer.DEFAULT - ) - (typeRemapper as? DeepCopyTypeRemapper)?.deepCopy = deepCopy - deepCopy } + val typeRemapper = DeepCopyTypeRemapper(typeParamsAwareSymbolRemapper) + val typeParamRemapper = object : TypeRemapper by typeRemapper { + override fun remapType(type: IrType): IrType { + return typeRemapper.remapType(type.remapTypeParameters(source, target)) + } + } + + @Suppress("DEPRECATION") + val deepCopy = DeepCopyPreservingMetadata( + typeParamsAwareSymbolRemapper, + typeParamRemapper, + SymbolRenamer.DEFAULT + ) + typeRemapper.deepCopy = deepCopy + + acceptVoid(typeParamsAwareSymbolRemapper) + return transform(deepCopy, null).patchDeclarationParents(target) as T }