diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 417212f2566..3f85022cc51 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -54,10 +54,11 @@ class DeclarationStubGenerator( constantValueGenerator.typeTranslator = typeTranslator } - fun generateEmptyModuleFragmentStub(descriptor: ModuleDescriptor, irBuiltIns: IrBuiltIns): IrModuleFragment = - IrModuleFragmentImpl(descriptor, irBuiltIns) - fun generateOrGetEmptyExternalPackageFragmentStub(descriptor: PackageFragmentDescriptor): IrExternalPackageFragment { + val referenced = symbolTable.referenceExternalPackageFragment(descriptor) + if (referenced.isBound) { + return referenced.owner + } return symbolTable.declareExternalPackageFragment(descriptor) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index d2d756ed6e9..7a1da9e7527 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -197,6 +197,7 @@ open class SymbolTable : ReferenceSymbolTable { currentScope?.dump() ?: "" } + private val externalPackageFragmentTable = FlatSymbolTable() private val classSymbolTable = FlatSymbolTable() private val constructorSymbolTable = FlatSymbolTable() private val enumEntrySymbolTable = FlatSymbolTable() @@ -209,11 +210,17 @@ open class SymbolTable : ReferenceSymbolTable { private val variableSymbolTable = ScopedSymbolTable() private val scopedSymbolTables = listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable) - fun declareFile(fileEntry: SourceManager.FileEntry, packageFragmentDescriptor: PackageFragmentDescriptor): IrFile = - IrFileImpl(fileEntry, IrFileSymbolImpl(packageFragmentDescriptor)) + fun referenceExternalPackageFragment(descriptor: PackageFragmentDescriptor) = + externalPackageFragmentTable.referenced(descriptor) { IrExternalPackageFragmentSymbolImpl(descriptor) } + + fun declareExternalPackageFragment(descriptor: PackageFragmentDescriptor): IrExternalPackageFragment { + return externalPackageFragmentTable.declare( + descriptor, + { IrExternalPackageFragmentSymbolImpl(descriptor) }, + { IrExternalPackageFragmentImpl(it) } + ) + } - fun declareExternalPackageFragment(packageFragmentDescriptor: PackageFragmentDescriptor): IrExternalPackageFragment = - IrExternalPackageFragmentImpl(IrExternalPackageFragmentSymbolImpl(packageFragmentDescriptor)) fun declareAnonymousInitializer( startOffset: Int,