diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index ac7374d8a10..4796e586d6e 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -189,16 +189,18 @@ abstract class KotlinIrLinker( return symbol.owner as IrDeclaration } + open fun getFileOf(declaration: IrDeclaration): IrFile = declaration.file + override fun tryReferencingSimpleFunctionByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrSimpleFunctionSymbol? { if (idSignature.isPubliclyVisible) return null - val file = parent.file + val file = getFileOf(parent) val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration return resolveModuleDeserializer(moduleDescriptor, null).referenceSimpleFunctionByLocalSignature(file, idSignature) } override fun tryReferencingPropertyByLocalSignature(parent: IrDeclaration, idSignature: IdSignature): IrPropertySymbol? { if (idSignature.isPubliclyVisible) return null - val file = parent.file + val file = getFileOf(parent) val moduleDescriptor = file.packageFragmentDescriptor.containingDeclaration return resolveModuleDeserializer(moduleDescriptor, null).referencePropertyByLocalSignature(file, idSignature) } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 5118ce1dd47..4f1355c0e45 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -372,6 +372,15 @@ internal class KonanIrLinker( super.postProcess() } + private val inlineFunctionFiles = mutableMapOf() + + override fun getFileOf(declaration: IrDeclaration): IrFile { + val packageFragment = declaration.getPackageFragment() + return packageFragment as? IrFile + ?: inlineFunctionFiles[packageFragment as IrExternalPackageFragment] + ?: error("Unknown external package fragment: ${packageFragment.packageFragmentDescriptor}") + } + private val IrClass.firstNonClassParent: IrDeclarationParent get() { var parent = parent @@ -643,8 +652,6 @@ internal class KonanIrLinker( } } - private val inlineFunctionFiles = mutableMapOf() - fun deserializeInlineFunction(function: IrFunction): InlineFunctionOriginInfo { val packageFragment = function.getPackageFragment() as? IrExternalPackageFragment ?: error("Expected an external package fragment for ${function.render()}") @@ -666,6 +673,13 @@ internal class KonanIrLinker( val declarationDeserializer = fileDeserializationState.declarationDeserializer val symbolDeserializer = declarationDeserializer.symbolDeserializer + inlineFunctionFiles[packageFragment]?.let { + require(it == fileDeserializationState.file) { + "Different files ${it.fileEntry.name} and ${fileDeserializationState.file.fileEntry.name} have the same $packageFragment" + } + } + inlineFunctionFiles[packageFragment] = fileDeserializationState.file + val outerClasses = (function.parent as? IrClass)?.getOuterClasses(takeOnlyInner = true) ?: emptyList() require((outerClasses.getOrNull(0)?.firstNonClassParent ?: function.parent) is IrExternalPackageFragment) { "Local inline functions are not supported: ${function.render()}" @@ -701,23 +715,17 @@ internal class KonanIrLinker( symbolDeserializer.referenceLocalIrSymbol(outerClasses[index].thisReceiver!!.symbol, symbolDeserializer.deserializeIdSignature(sigIndex)) } - function.body = declarationDeserializer.deserializeStatementBody(inlineFunctionReference.body) as IrBody - - function.valueParameters.forEachIndexed { index, parameter -> - val defaultValueIndex = inlineFunctionReference.defaultValues[index] - if (defaultValueIndex != InvalidIndex) - parameter.defaultValue = declarationDeserializer.deserializeExpressionBody(defaultValueIndex) + with(declarationDeserializer) { + function.body = (deserializeStatementBody(inlineFunctionReference.body) as IrBody).setDeclarationsParent(function) + function.valueParameters.forEachIndexed { index, parameter -> + val defaultValueIndex = inlineFunctionReference.defaultValues[index] + if (defaultValueIndex != InvalidIndex) + parameter.defaultValue = deserializeExpressionBody(defaultValueIndex)?.setDeclarationsParent(function) + } } fakeOverrideBuilder.provideFakeOverrides() - inlineFunctionFiles[packageFragment]?.let { - require(it == fileDeserializationState.file) { - "Different files ${it.fileEntry.name} and ${fileDeserializationState.file.fileEntry.name} have the same $packageFragment" - } - } - inlineFunctionFiles[packageFragment] = fileDeserializationState.file - return InlineFunctionOriginInfo(function, fileDeserializationState.file, inlineFunctionReference.startOffset, inlineFunctionReference.endOffset) }