diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt index 29f4cee9e81..cfceb1fa7bd 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/overrides/FakeOverrides.kt @@ -170,21 +170,8 @@ class FakeOverrideBuilder( } } - fun provideFakeOverrides(module: IrModuleFragment) { - module.acceptVoid(object : IrElementVisitorVoid { - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) - } - - override fun visitClass(declaration: IrClass) { - buildFakeOverrideChainsForClass(declaration) - haveFakeOverrides.add(declaration) - super.visitClass(declaration) - } - - override fun visitFunction(declaration: IrFunction) { - // Don't go for function local classes - } - }) + fun provideFakeOverrides(klass: IrClass) { + buildFakeOverrideChainsForClass(klass) + haveFakeOverrides.add(klass) } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt index 0dbb38b335c..5a9ec59f2ac 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/IrFileDeserializer.kt @@ -110,7 +110,8 @@ abstract class IrFileDeserializer( val builtIns: IrBuiltIns, val symbolTable: SymbolTable, protected var deserializeBodies: Boolean, - private val deserializeFakeOverrides: Boolean + private val deserializeFakeOverrides: Boolean, + private val fakeOverrideQueue: MutableList ) { abstract fun deserializeIrSymbolToDeclare(code: Long): Pair @@ -1051,6 +1052,12 @@ abstract class IrFileDeserializer( thisReceiver = deserializeIrValueParameter(proto.thisReceiver, -1) (descriptor as? WrappedClassDescriptor)?.bind(this) + + if (!deserializeFakeOverrides) { + if (symbol.isPublicApi) { + fakeOverrideQueue.add(this) + } + } } } diff --git a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt index 33f0877936b..af7e9a8fe43 100644 --- a/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt +++ b/compiler/ir/serialization.common/src/org/jetbrains/kotlin/backend/common/serialization/KotlinIrLinker.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.EmptyPackageFragmentDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -71,6 +72,7 @@ abstract class KotlinIrLinker( abstract val fakeOverrideBuilder: FakeOverrideBuilder private val haveSeen = mutableSetOf() + private val fakeOverrideClassQueue = mutableListOf() private lateinit var linkerExtensions: Collection @@ -228,7 +230,7 @@ abstract class KotlinIrLinker( inlineBodies: Boolean, deserializeFakeOverrides: Boolean, private val moduleDeserializer: IrModuleDeserializer - ) : IrFileDeserializer(logger, builtIns, symbolTable, !onlyHeaders, deserializeFakeOverrides) { + ) : IrFileDeserializer(logger, builtIns, symbolTable, !onlyHeaders, deserializeFakeOverrides, fakeOverrideClassQueue) { private var fileLoops = mutableMapOf() @@ -588,13 +590,10 @@ abstract class KotlinIrLinker( override fun postProcess() { finalizeExpectActualLinker() - - if (!deserializeFakeOverrides) { - deserializersForModules.values.forEach { - it.postProcess { - fakeOverrideBuilder.provideFakeOverrides(it) - } - } + + while (fakeOverrideClassQueue.isNotEmpty()) { + val klass = fakeOverrideClassQueue.removeLast() + fakeOverrideBuilder.provideFakeOverrides(klass) } // TODO: fix IrPluginContext to make it not produce additional external reference