From 6d3839c125dec93aac59af082ba728a17e80f4d1 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Fri, 4 Sep 2020 14:15:19 +0700 Subject: [PATCH] [KT-41655] Fix support for forward declarations. Fix type translation for forward declarations by converting it to LazyIR. --- .../konan/serialization/KonanIrlinker.kt | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt index 9a8d9228bc4..8aa2413ec04 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIrlinker.kt @@ -171,7 +171,6 @@ internal class KonanIrLinker( } private val declaredDeclaration = mutableMapOf() - private val packageToFileMap = mutableMapOf() private fun IdSignature.isForwardDeclarationSignature(): Boolean { if (isPublic) { @@ -191,30 +190,12 @@ internal class KonanIrLinker( moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: error("No declaration found with $idSig") } - private fun getIrFile(packageFragment: PackageFragmentDescriptor): IrFile { - val fqn = packageFragment.fqName - return packageToFileMap.getOrPut(packageFragment.fqName) { - val fileSymbol = IrFileSymbolImpl(packageFragment) - IrFileImpl(NaiveSourceBasedFileEntryImpl("forward declarations for $fqn"), fileSymbol, packageFragment.fqName).also { - moduleFragment.files.add(it) - } + private fun buildForwardDeclarationStub(descriptor: ClassDescriptor): IrClass { + return stubGenerator.generateClassStub(descriptor).also { + it.origin = FORWARD_DECLARATION_ORIGIN } } - private fun buildForwardDeclarationStub(idSig: IdSignature, descriptor: ClassDescriptor): IrClass { - val packageDescriptor = descriptor.containingDeclaration as PackageFragmentDescriptor - val irFile = getIrFile(packageDescriptor) - - val klass = symbolTable.declareClassFromLinker(descriptor, idSig) { symbol -> - symbolTable.irFactory.createIrClassFromDescriptor(offset, offset, FORWARD_DECLARATION_ORIGIN, symbol, descriptor) - } - - klass.parent = irFile - irFile.declarations.add(klass) - - return klass - } - override fun deserializeIrSymbol(idSig: IdSignature, symbolKind: BinarySymbolData.SymbolKind): IrSymbol { assert(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) { "Only class could be a Forward declaration $idSig (kind $symbolKind)" } val descriptor = resolveDescriptor(idSig) @@ -225,7 +206,7 @@ internal class KonanIrLinker( return symbolTable.referenceClassFromLinker(descriptor, idSig) } - return declaredDeclaration.getOrPut(idSig) { buildForwardDeclarationStub(idSig, descriptor) }.symbol + return declaredDeclaration.getOrPut(idSig) { buildForwardDeclarationStub(descriptor) }.symbol } override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns)