FIR2IR: register file first and convert declarations second

This allows to find parent declaration from another file correctly
This commit is contained in:
Mikhail Glukhikh
2020-03-02 18:17:41 +03:00
parent cfa626ad77
commit 698e259438
3 changed files with 19 additions and 10 deletions
@@ -35,10 +35,13 @@ object Fir2IrConverter {
typeTranslator.constantValueGenerator = constantValueGenerator
val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, signaturer, symbolTable)
val sourceManager = PsiSourceManager()
val fir2irTransformer = Fir2IrVisitor(session, moduleDescriptor, symbolTable, sourceManager, builtIns, fakeOverrideMode)
val fir2irVisitor = Fir2IrVisitor(session, moduleDescriptor, symbolTable, sourceManager, builtIns, fakeOverrideMode)
val irFiles = mutableListOf<IrFile>()
for (firFile in firFiles) {
val irFile = firFile.accept(fir2irTransformer, null) as IrFile
fir2irVisitor.registerFile(firFile)
}
for (firFile in firFiles) {
val irFile = firFile.accept(fir2irVisitor, null) as IrFile
val fileEntry = sourceManager.getOrCreateFileEntry(firFile.psi as KtFile)
sourceManager.putFileEntry(irFile, fileEntry)
irFiles += irFile
@@ -80,6 +80,10 @@ class Fir2IrDeclarationStorage(
fileCache[firFile] = irFile
}
fun getIrFile(firFile: FirFile): IrFile {
return fileCache[firFile]!!
}
fun enterScope(descriptor: DeclarationDescriptor) {
irSymbolTable.enterScope(descriptor)
if (descriptor is WrappedSimpleFunctionDescriptor ||
@@ -525,7 +529,7 @@ class Fir2IrDeclarationStorage(
fun getIrFunction(
function: FirSimpleFunction,
irParent: IrDeclarationParent? = null,
irParent: IrDeclarationParent?,
shouldLeaveScope: Boolean = false,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
): IrSimpleFunction {
@@ -87,14 +87,16 @@ class Fir2IrVisitor(
TODO("Should not be here: ${element.render()}")
}
fun registerFile(file: FirFile) {
val irFile = IrFileImpl(
sourceManager.getOrCreateFileEntry(file.psi as KtFile),
moduleDescriptor.getPackage(file.packageFqName).fragments.first()
)
declarationStorage.registerFile(file, irFile)
}
override fun visitFile(file: FirFile, data: Any?): IrFile {
return conversionScope.withParent(
IrFileImpl(
sourceManager.getOrCreateFileEntry(file.psi as KtFile),
moduleDescriptor.getPackage(file.packageFqName).fragments.first()
)
) {
declarationStorage.registerFile(file, this)
return conversionScope.withParent(declarationStorage.getIrFile(file)) {
file.declarations.forEach {
val irDeclaration = it.toIrDeclaration() ?: return@forEach
declarations += irDeclaration