[KT-41655] Fix support for forward declarations.

Fix type translation for forward declarations by converting it to LazyIR.
This commit is contained in:
Sergey Bogolepov
2020-09-04 14:15:19 +07:00
committed by Sergey Bogolepov
parent 4f8b7d1266
commit 6d3839c125
@@ -171,7 +171,6 @@ internal class KonanIrLinker(
}
private val declaredDeclaration = mutableMapOf<IdSignature, IrClass>()
private val packageToFileMap = mutableMapOf<FqName, IrFile>()
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)