diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt index 88ae56af10c..2c0a2d16595 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/ExpectDeclarationRemover.kt @@ -166,9 +166,7 @@ open class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, priva expectActualTypeParametersMap: Map ): IrExpressionBody { return this - .deepCopyWithSymbols(actualFunction) { symbolRemapper, _ -> - DeepCopyIrTreeWithSymbols(symbolRemapper, IrTypeParameterRemapper(expectActualTypeParametersMap)) - } + .deepCopyWithSymbols(actualFunction) { IrTypeParameterRemapper(expectActualTypeParametersMap) } .transform(object : IrElementTransformerVoid() { override fun visitGetValue(expression: IrGetValue): IrExpression { expression.transformChildrenVoid() diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt index 5ceecbdc21e..00109c31c80 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualLinker.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols import org.jetbrains.kotlin.ir.util.SymbolRemapper -import org.jetbrains.kotlin.ir.util.TypeRemapper import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.utils.memoryOptimizedMap @@ -76,9 +75,7 @@ internal class ActualizerSymbolRemapper(private val expectActualMap: Map S.actualizeSymbol(): S = (expectActualMap[this] as? S) ?: this } -internal open class ActualizerVisitor(private val symbolRemapper: SymbolRemapper, typeRemapper: TypeRemapper) : - DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) { - +internal open class ActualizerVisitor(private val symbolRemapper: SymbolRemapper) : DeepCopyIrTreeWithSymbols(symbolRemapper) { // We shouldn't touch attributes, because Fir2Ir wouldn't set them to anything meaningful anyway. // So it would be better to have them as is, i.e. referring to `this`, not some random node removed from the tree override fun D.processAttributes(other: IrAttributeContainer?): D = this diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/FunctionDefaultParametersActualizer.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/FunctionDefaultParametersActualizer.kt index dba882d95b1..7de9570cdef 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/FunctionDefaultParametersActualizer.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/FunctionDefaultParametersActualizer.kt @@ -10,14 +10,15 @@ import org.jetbrains.kotlin.ir.declarations.copyAttributes import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.SymbolRemapper +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols +import org.jetbrains.kotlin.ir.util.remapSymbolParent internal class FunctionDefaultParametersActualizer( symbolRemapper: ActualizerSymbolRemapper, - typeRemapper: DeepCopyTypeRemapper, private val expectActualMap: Map ) { - private val visitor = FunctionDefaultParametersActualizerVisitor(symbolRemapper, typeRemapper) + private val visitor = FunctionDefaultParametersActualizerVisitor(symbolRemapper) fun actualize() { for ((expect, actual) in expectActualMap) { @@ -37,8 +38,7 @@ internal class FunctionDefaultParametersActualizer( } } -private class FunctionDefaultParametersActualizerVisitor(private val symbolRemapper: SymbolRemapper, typeRemapper: TypeRemapper) : - ActualizerVisitor(symbolRemapper, typeRemapper) { +private class FunctionDefaultParametersActualizerVisitor(private val symbolRemapper: SymbolRemapper) : ActualizerVisitor(symbolRemapper) { override fun visitGetValue(expression: IrGetValue): IrGetValue { // It performs actualization of dispatch/extension receivers // It's actual only for default parameter values of expect functions because expect functions don't have bodies diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt index 172c8839479..7d932ed0a32 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt @@ -5,16 +5,17 @@ package org.jetbrains.kotlin.backend.common.actualizer -import org.jetbrains.kotlin.ir.IrDiagnosticReporter import org.jetbrains.kotlin.backend.common.actualizer.checker.IrExpectActualCheckers import org.jetbrains.kotlin.incremental.components.ExpectActualTracker +import org.jetbrains.kotlin.ir.IrDiagnosticReporter import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrTypeSystemContext import org.jetbrains.kotlin.ir.types.classOrFail -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.SymbolRemapper +import org.jetbrains.kotlin.ir.util.classIdOrFail data class IrActualizedResult( val actualizedExpectDeclarations: List, @@ -70,9 +71,7 @@ class IrActualizer( return getReferencedClass(symbol) } } - val classTypeRemapper = DeepCopyTypeRemapper(classSymbolRemapper) - val classActualizerVisitor = ActualizerVisitor(classSymbolRemapper, classTypeRemapper) - dependentFragments.forEach { it.transform(classActualizerVisitor, null) } + dependentFragments.forEach { it.transform(ActualizerVisitor(classSymbolRemapper), null) } } fun actualizeCallablesAndMergeModules(): Map { @@ -95,11 +94,10 @@ class IrActualizer( // 4. Copy and actualize function parameter default values from expect functions val symbolRemapper = ActualizerSymbolRemapper(expectActualMap) - val typeRemapper = DeepCopyTypeRemapper(symbolRemapper) - FunctionDefaultParametersActualizer(symbolRemapper, typeRemapper, expectActualMap).actualize() + FunctionDefaultParametersActualizer(symbolRemapper, expectActualMap).actualize() // 5. Actualize expect calls in dependent fragments using info obtained in the previous steps - val actualizerVisitor = ActualizerVisitor(symbolRemapper, typeRemapper) + val actualizerVisitor = ActualizerVisitor(symbolRemapper) dependentFragments.forEach { it.transform(actualizerVisitor, null) } // 6. Move all declarations to mainFragment diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt index 88e35043e53..00b277af3c1 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.backend.common.actualizer -import org.jetbrains.kotlin.ir.IrDiagnosticReporter import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.ir.IrDiagnosticReporter import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.builders.declarations.buildFun @@ -21,7 +21,9 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.resolve.calls.mpp.AbstractExpectActualMatcher -import org.jetbrains.kotlin.resolve.multiplatform.* +import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualAnnotationsIncompatibilityType +import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCheckingCompatibility +import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualMatchingCompatibility import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled @@ -220,9 +222,8 @@ private fun createFakeOverrideFunction( it.annotations = actualFunction.annotations.map { p -> p.deepCopyWithSymbols(it) } it.typeParameters = actualFunction.typeParameters.map { p -> p.deepCopyWithSymbols(it) } - val typeRemapper = IrTypeParameterRemapper(actualFunction.typeParameters.zip(it.typeParameters).toMap()) - fun IrValueParameter.deepCopyWithTypeParameters(): IrValueParameter = deepCopyWithSymbols(it) { symbolRemapper, _ -> - DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) + fun IrValueParameter.deepCopyWithTypeParameters(): IrValueParameter = deepCopyWithSymbols(it) { _ -> + IrTypeParameterRemapper(actualFunction.typeParameters.zip(it.typeParameters).toMap()) } it.dispatchReceiverParameter = actualFunction.dispatchReceiverParameter?.deepCopyWithTypeParameters() 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 index 35387484050..420e64d97a4 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/DeepCopyIrTreeWithDeclarations.kt @@ -7,7 +7,6 @@ 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.DeepCopyTypeRemapper import org.jetbrains.kotlin.ir.util.NullDescriptorsRemapper import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -16,7 +15,5 @@ fun T.deepCopyWithVariables(): T { val symbolsRemapper = DeepCopySymbolRemapper(NullDescriptorsRemapper) acceptVoid(symbolsRemapper) - val typesRemapper = DeepCopyTypeRemapper(symbolsRemapper) - - return this.transform(DeepCopyIrTreeWithSymbols(symbolsRemapper, typesRemapper), null) as T + 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 a7542c5ac62..4adc8ac6882 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 @@ -25,33 +25,29 @@ import org.jetbrains.kotlin.utils.memoryOptimizedMap inline fun T.deepCopyWithSymbols( initialParent: IrDeclarationParent? = null, - createCopier: (SymbolRemapper, TypeRemapper) -> DeepCopyIrTreeWithSymbols = - { symbolRemapper, typeRemapper -> DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) }, -): T = deepCopyWithSymbols(initialParent, DeepCopySymbolRemapper(), createCopier) - -inline fun T.deepCopyWithSymbols( - initialParent: IrDeclarationParent?, - symbolRemapper: DeepCopySymbolRemapper, - createCopier: (SymbolRemapper, TypeRemapper) -> DeepCopyIrTreeWithSymbols = - { symbolRemapper, typeRemapper -> DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) }, + createTypeRemapper: (SymbolRemapper) -> TypeRemapper = ::DeepCopyTypeRemapper ): T { + val symbolRemapper = DeepCopySymbolRemapper() acceptVoid(symbolRemapper) - val typeRemapper = DeepCopyTypeRemapper(symbolRemapper) - return transform(createCopier(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T + val typeRemapper = createTypeRemapper(symbolRemapper) + return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T } @OptIn(ObsoleteDescriptorBasedAPI::class) open class DeepCopyIrTreeWithSymbols( private val symbolRemapper: SymbolRemapper, - private val typeRemapper: TypeRemapper, + typeRemapper: TypeRemapper? = null, // This parameter is not used meaningfully, but is left for compatibility with compose. @Suppress("UNUSED_PARAMETER") symbolRenamer: SymbolRenamer? = null, ) : IrElementTransformerVoid() { private var transformedModule: IrModuleFragment? = null + private val typeRemapper: TypeRemapper = typeRemapper ?: DeepCopyTypeRemapper(symbolRemapper) init { // TODO refactor - (typeRemapper as? DeepCopyTypeRemapper)?.let { + // After removing usages of DeepCopyTypeRemapper constructor from compose, the lateinit property `DeepCopyTypeRemapper.deepCopy` + // can be refactored to a constructor parameter. + (this.typeRemapper as? DeepCopyTypeRemapper)?.let { it.deepCopy = this } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySavingMetadata.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySavingMetadata.kt index 1cedff7bd95..e407a486739 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySavingMetadata.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySavingMetadata.kt @@ -14,14 +14,11 @@ fun T.deepCopySavingMetadata( symbolRemapper: DeepCopySymbolRemapper = DeepCopySymbolRemapper() ): T { acceptVoid(symbolRemapper) - val typeRemapper = DeepCopyTypeRemapper(symbolRemapper) @Suppress("UNCHECKED_CAST") - return transform(DeepCopySavingMetadata(symbolRemapper, typeRemapper), null) - .patchDeclarationParents(initialParent) as T + return transform(DeepCopySavingMetadata(symbolRemapper), null).patchDeclarationParents(initialParent) as T } -private class DeepCopySavingMetadata(symbolRemapper: SymbolRemapper, typeRemapper: TypeRemapper) : - DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper) { +private class DeepCopySavingMetadata(symbolRemapper: SymbolRemapper) : DeepCopyIrTreeWithSymbols(symbolRemapper) { override fun visitFile(declaration: IrFile): IrFile = super.visitFile(declaration).apply { metadata = declaration.metadata @@ -30,7 +27,6 @@ private class DeepCopySavingMetadata(symbolRemapper: SymbolRemapper, typeRemappe override fun visitClass(declaration: IrClass): IrClass = super.visitClass(declaration).apply { metadata = declaration.metadata - } override fun visitConstructor(declaration: IrConstructor): IrConstructor = diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index 41187bb9318..bb1f6e1043a 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -169,7 +169,7 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr val symbolRemapper = SymbolRemapper() acceptVoid(symbolRemapper) - return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, DeepCopyTypeRemapper(symbolRemapper)), data = null) + return transform(DeepCopyIrTreeWithSymbols(symbolRemapper), data = null) } private fun remapExpectTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameter {