From d5c2aa4c0ce8b95ce4b6c6d6eb17e415a6dc40e5 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 7 Mar 2024 14:14:40 +0100 Subject: [PATCH] IR: rename and move deepCopyWithVariables Rename it to `deepCopyWithoutPatchingParents`, move to `org.jetbrains.kotlin.ir.util`, make it inline+reified, and extract the common implementation with `deepCopyWithSymbols` into `deepCopyImpl`. --- .../JvmAnnotationImplementationTransformer.kt | 3 +-- .../kotlin/backend/jvm/MfvcNodeFactory.kt | 3 +-- .../ir/DeepCopyIrTreeWithDeclarations.kt | 19 ------------------- .../ir/util/DeepCopyIrTreeWithSymbols.kt | 11 ++++++++++- .../jetbrains/kotlin/ir/util/Deprecated.kt | 15 +++++++++++++++ .../ir/plugin/BodyWithDefaultValueReplacer.kt | 4 ++-- .../compiler/backend/ir/BaseIrGenerator.kt | 1 - .../compiler/backend/ir/DefaultValuesUtils.kt | 6 +++--- .../backend/ir/IrBuilderWithPluginContext.kt | 3 +-- .../backend/ir/SerializableIrGenerator.kt | 3 +-- .../backend/ir/SerializerIrGenerator.kt | 3 +-- 11 files changed, 35 insertions(+), 36 deletions(-) delete mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt index a02f394b411..992a8d7c260 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.ir.IrBuiltIns import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.builders.declarations.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrDelegatingConstructorCallImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -282,7 +281,7 @@ class JvmAnnotationImplementationTransformer(val jvmContext: JvmBackendContext, fallbackPrimaryCtorParamsMap[propName]?.defaultValue?.takeIf { it.expression !is IrErrorExpression } else -> null } - parameter.defaultValue = newDefaultValue?.deepCopyWithVariables() + parameter.defaultValue = newDefaultValue?.deepCopyWithoutPatchingParents() ?.also { if (defaultValueTransformer != null) it.transformChildrenVoid(defaultValueTransformer) } ctorBody.statements += with(ctorBodyBuilder) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MfvcNodeFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MfvcNodeFactory.kt index c3d82e8053e..9ecd5538c96 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MfvcNodeFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/MfvcNodeFactory.kt @@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.types.IrSimpleType @@ -64,7 +63,7 @@ fun createLeafMfvcNode( oldBackingField.metadata = null }.apply { this.parent = oldBackingField.parent - this.annotations = fieldAnnotations.map { it.deepCopyWithVariables() } + this.annotations = fieldAnnotations.map { it.deepCopyWithoutPatchingParents() } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt deleted file mode 100644 index 420e64d97a4..00000000000 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.ir - -import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols -import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper -import org.jetbrains.kotlin.ir.util.NullDescriptorsRemapper -import org.jetbrains.kotlin.ir.visitors.acceptVoid - -@Suppress("UNCHECKED_CAST") -fun T.deepCopyWithVariables(): T { - val symbolsRemapper = DeepCopySymbolRemapper(NullDescriptorsRemapper) - acceptVoid(symbolsRemapper) - - return this.transform(DeepCopyIrTreeWithSymbols(symbolsRemapper), null) as T -} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 4adc8ac6882..3b711c1fc01 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -27,10 +27,19 @@ inline fun T.deepCopyWithSymbols( initialParent: IrDeclarationParent? = null, createTypeRemapper: (SymbolRemapper) -> TypeRemapper = ::DeepCopyTypeRemapper ): T { + return (deepCopyImpl(createTypeRemapper) as T).patchDeclarationParents(initialParent) +} + +inline fun T.deepCopyWithoutPatchingParents(): T { + return deepCopyImpl(::DeepCopyTypeRemapper) as T +} + +@PublishedApi +internal inline fun T.deepCopyImpl(createTypeRemapper: (SymbolRemapper) -> TypeRemapper): IrElement { val symbolRemapper = DeepCopySymbolRemapper() acceptVoid(symbolRemapper) val typeRemapper = createTypeRemapper(symbolRemapper) - return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T + return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null) } @OptIn(ObsoleteDescriptorBasedAPI::class) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Deprecated.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Deprecated.kt index ae357903651..72127407fc1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Deprecated.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/Deprecated.kt @@ -7,7 +7,9 @@ package org.jetbrains.kotlin.ir.util import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrFileEntry +import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrFile +import org.jetbrains.kotlin.ir.visitors.acceptVoid @Deprecated( "Use the overload with DumpIrTreeOptions instead.", @@ -69,3 +71,16 @@ abstract class SymbolRenamer private constructor() { @Deprecated("Used from Compose.") companion object DEFAULT : SymbolRenamer() } + +// This member is left for compatibility with compose. +@Deprecated("Use the other deepCopyWithSymbols instead.") +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@kotlin.internal.LowPriorityInOverloadResolution // To fix bootstrap with K1 which cannot distinguish between the other deepCopyWithSymbols by lambda type. +inline fun T.deepCopyWithSymbols( + initialParent: IrDeclarationParent?, + createCopier: (SymbolRemapper, TypeRemapper) -> DeepCopyIrTreeWithSymbols, +): T { + val symbolRemapper = DeepCopySymbolRemapper() + acceptVoid(symbolRemapper) + return transform(createCopier(symbolRemapper, DeepCopyTypeRemapper(symbolRemapper)), null).patchDeclarationParents(initialParent) as T +} diff --git a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/ir/plugin/BodyWithDefaultValueReplacer.kt b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/ir/plugin/BodyWithDefaultValueReplacer.kt index e113619e51d..a8e6bc98501 100644 --- a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/ir/plugin/BodyWithDefaultValueReplacer.kt +++ b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/ir/plugin/BodyWithDefaultValueReplacer.kt @@ -9,8 +9,8 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrReturn +import org.jetbrains.kotlin.ir.util.deepCopyWithoutPatchingParents import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.name.Name @@ -37,7 +37,7 @@ class BodyWithDefaultValueReplacer : IrElementVisitorVoid { } override fun visitReturn(expression: IrReturn) { - expression.value = defaultValue.expression.deepCopyWithVariables() + expression.value = defaultValue.expression.deepCopyWithoutPatchingParents() } } declaration.body?.acceptChildrenVoid(bodyReplacer) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt index 708fcf1ed13..86de0b5eb92 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/BaseIrGenerator.kt @@ -15,7 +15,6 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrClassReference import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpressionBody diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/DefaultValuesUtils.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/DefaultValuesUtils.kt index 6cef9f408f1..5a9ce3ccf66 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/DefaultValuesUtils.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/DefaultValuesUtils.kt @@ -13,12 +13,12 @@ import org.jetbrains.kotlin.ir.builders.irGetField import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.IrValueParameter -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.util.constructors +import org.jetbrains.kotlin.ir.util.deepCopyWithoutPatchingParents import org.jetbrains.kotlin.ir.util.properties import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -114,7 +114,7 @@ fun createInitializerAdapter( } else { rawExpression } - return expression.deepCopyWithVariables().transform(initializerTransformer, null) + return expression.deepCopyWithoutPatchingParents().transform(initializerTransformer, null) } } @@ -125,4 +125,4 @@ private fun extractDefaultValuesFromConstructor(irClass: IrClass?): Map = original?.valueParameters?.associate { it.symbol to it.defaultValue?.expression } ?: emptyMap() return defaultsMap + extractDefaultValuesFromConstructor(irClass.getSuperClassNotAny()) -} \ No newline at end of file +} diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt index d76f42a5234..94d19c8856d 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/IrBuilderWithPluginContext.kt @@ -19,7 +19,6 @@ import org.jetbrains.kotlin.ir.builders.declarations.addProperty import org.jetbrains.kotlin.ir.builders.declarations.buildField import org.jetbrains.kotlin.ir.builders.declarations.buildFun import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol @@ -432,7 +431,7 @@ interface IrBuilderWithPluginContext { } fun IrBuilderWithScope.copyAnnotationsFrom(annotations: List): List = - annotations.filter { it.symbol.owner.parentAsClass.isSerialInfoAnnotation }.map { it.deepCopyWithVariables() } + annotations.filter { it.symbol.owner.parentAsClass.isSerialInfoAnnotation }.map { it.deepCopyWithoutPatchingParents() } @OptIn(ObsoleteDescriptorBasedAPI::class) fun IrBuilderWithScope.wrapperClassReference(classType: IrType): IrClassReference { diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt index 625abf4efcb..31760965bda 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializableIrGenerator.kt @@ -13,7 +13,6 @@ import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin @@ -95,7 +94,7 @@ class SerializableIrGenerator( } } it is IrAnonymousInitializer -> { - val statements = it.body.deepCopyWithVariables().statements + val statements = it.body.deepCopyWithoutPatchingParents().statements statementsAfterSerializableProperty.getOrPutNullable(current, { mutableListOf() }) .addAll(statements) } diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 9ebbdb3ac90..7ff429f5d26 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.deepCopyWithVariables import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpressionBody @@ -461,7 +460,7 @@ open class SerializerIrGenerator( val decodeSequentiallyCall = irInvoke(localInput.get(), inputClass.functionByName(CallingConventions.decodeSequentially)) val sequentialPart = irBlock { - decoderCalls.forEach { (_, expr) -> +expr.deepCopyWithVariables() } + decoderCalls.forEach { (_, expr) -> +expr.deepCopyWithoutPatchingParents() } } val byIndexPart: IrExpression = irWhile().also { loop ->