[KT-41655] Fix support for forward declarations.
Fix type translation for forward declarations by converting it to LazyIR.
This commit is contained in:
committed by
Sergey Bogolepov
parent
4f8b7d1266
commit
6d3839c125
+4
-23
@@ -171,7 +171,6 @@ internal class KonanIrLinker(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val declaredDeclaration = mutableMapOf<IdSignature, IrClass>()
|
private val declaredDeclaration = mutableMapOf<IdSignature, IrClass>()
|
||||||
private val packageToFileMap = mutableMapOf<FqName, IrFile>()
|
|
||||||
|
|
||||||
private fun IdSignature.isForwardDeclarationSignature(): Boolean {
|
private fun IdSignature.isForwardDeclarationSignature(): Boolean {
|
||||||
if (isPublic) {
|
if (isPublic) {
|
||||||
@@ -191,30 +190,12 @@ internal class KonanIrLinker(
|
|||||||
moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: error("No declaration found with $idSig")
|
moduleDescriptor.findClassAcrossModuleDependencies(classId) ?: error("No declaration found with $idSig")
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIrFile(packageFragment: PackageFragmentDescriptor): IrFile {
|
private fun buildForwardDeclarationStub(descriptor: ClassDescriptor): IrClass {
|
||||||
val fqn = packageFragment.fqName
|
return stubGenerator.generateClassStub(descriptor).also {
|
||||||
return packageToFileMap.getOrPut(packageFragment.fqName) {
|
it.origin = FORWARD_DECLARATION_ORIGIN
|
||||||
val fileSymbol = IrFileSymbolImpl(packageFragment)
|
|
||||||
IrFileImpl(NaiveSourceBasedFileEntryImpl("forward declarations for $fqn"), fileSymbol, packageFragment.fqName).also {
|
|
||||||
moduleFragment.files.add(it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
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)" }
|
assert(symbolKind == BinarySymbolData.SymbolKind.CLASS_SYMBOL) { "Only class could be a Forward declaration $idSig (kind $symbolKind)" }
|
||||||
val descriptor = resolveDescriptor(idSig)
|
val descriptor = resolveDescriptor(idSig)
|
||||||
@@ -225,7 +206,7 @@ internal class KonanIrLinker(
|
|||||||
return symbolTable.referenceClassFromLinker(descriptor, idSig)
|
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)
|
override val moduleFragment: IrModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns)
|
||||||
|
|||||||
Reference in New Issue
Block a user