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 b4b8ac3957b..61d8533a150 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 @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.expressions.IrGetValue import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol +import org.jetbrains.kotlin.ir.types.extractTypeParameters import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid @@ -106,8 +107,8 @@ class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, private va val expectToActual = expectFunction to function if (expectToActual !in typeParameterSubstitutionMap) { - val functionTypeParameters = collectTypeParameters(function) - val expectFunctionTypeParameters = collectTypeParameters(expectFunction) + val functionTypeParameters = extractTypeParameters(function) + val expectFunctionTypeParameters = extractTypeParameters(expectFunction) expectFunctionTypeParameters.zip(functionTypeParameters).let { typeParametersMapping -> typeParameterSubstitutionMap[expectToActual] = typeParametersMapping.toMap() @@ -117,11 +118,13 @@ class ExpectDeclarationRemover(val symbolTable: ReferenceSymbolTable, private va defaultValue.let { originalDefault -> declaration.defaultValue = declaration.factory.createExpressionBody(originalDefault.startOffset, originalDefault.endOffset) { expression = originalDefault.expression - .deepCopyWithSymbols(function) - .remapExpectValueSymbols() - .apply { - remapTypes(IrTypeParameterRemapper(typeParameterSubstitutionMap.getValue(expectToActual))) + .deepCopyWithSymbols(function) { symbolRemapper, _ -> + DeepCopyIrTreeWithSymbols( + symbolRemapper, + IrTypeParameterRemapper(typeParameterSubstitutionMap.getValue(expectToActual)) + ) } + .remapExpectValueSymbols() } } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index 430da47731d..45066302933 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.builders.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.transformStatement +import org.jetbrains.kotlin.ir.types.extractTypeParameters import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -350,6 +351,6 @@ class InlineClassLowering(val context: CommonBackendContext) { function.parent, function.toInlineClassImplementationName(), function, - typeParametersFromContext = collectTypeParameters(function.parentAsClass) + typeParametersFromContext = extractTypeParameters(function.parentAsClass) ) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 031533cab8f..652fcada961 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -602,20 +602,4 @@ internal fun IrConst.shallowCopy() = IrConstImpl( type, kind, value -) - -fun collectTypeParameters(declaration: IrTypeParametersContainer): List { - val result = mutableListOf() - - fun collectImpl(declaration: IrDeclaration) { - if (declaration is IrTypeParametersContainer) { - result.addAll(declaration.typeParameters) - declaration.parentClassOrNull?.let { collectImpl(it) } - } - if (declaration is IrClass && declaration.isInner) collectImpl(declaration.parent as IrDeclaration) - } - - collectImpl(declaration) - - return result -} \ No newline at end of file +) \ No newline at end of file