diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt index 9b83f71950a..d3791476d6d 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/ToplevelPhases.kt @@ -162,7 +162,7 @@ internal val irGeneratorPluginsPhase = konanUnitPhase( // That requires some design and implementation work. internal val copyDefaultValuesToActualPhase = konanUnitPhase( op = { - irModule!!.files.forEach(ExpectToActualDefaultValueCopier(this)::lower) + ExpectToActualDefaultValueCopier(irModule!!).process() }, name = "CopyDefaultValuesToActual", description = "Copy default values from expect to actual declarations" diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index 1480cf3901d..2362f15e835 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.descriptors.isExpectMember import org.jetbrains.kotlin.backend.konan.descriptors.propertyIfAccessor +import org.jetbrains.kotlin.backend.konan.ir.ModuleIndex import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* @@ -17,7 +18,6 @@ import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper -import org.jetbrains.kotlin.ir.util.referenceFunction import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -42,9 +42,16 @@ internal class ExpectDeclarationsRemoving(val context: Context) : FileLoweringPa } } -internal class ExpectToActualDefaultValueCopier(val context: Context) : FileLoweringPass { +internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFragment) { - override fun lower(irFile: IrFile) { + // Note: local declarations aren't required here; TODO: use more lightweight index. + private val moduleIndex = ModuleIndex(irModule) + + fun process() { + irModule.files.forEach { this.process(it) } + } + + private fun process(irFile: IrFile) { // All declarations with `isExpect == true` are nested into a top-level declaration with `isExpect == true`. irFile.declarations.forEach { if (it.descriptor.isExpectMember) { @@ -84,10 +91,10 @@ internal class ExpectToActualDefaultValueCopier(val context: Context) : FileLowe } private inline fun T.findActualForExpected(): T = - context.ir.symbols.symbolTable.referenceFunction(descriptor.findActualForExpect()).owner as T + moduleIndex.functions[descriptor.findActualForExpect()] as T private fun IrClass.findActualForExpected(): IrClass = - context.ir.symbols.symbolTable.referenceClass(descriptor.findActualForExpect()).owner + moduleIndex.classes[descriptor.findActualForExpect()]!! private inline fun T.findActualForExpect() = with(ExpectedActualResolver) { val descriptor = this@findActualForExpect @@ -135,7 +142,7 @@ internal class ExpectToActualDefaultValueCopier(val context: Context) : FileLowe property.setter -> actualPropertyDescriptor.setter!! else -> error("Unexpected accessor of $symbol ${symbol.descriptor}") } - context.ir.symbols.symbolTable.referenceFunction(accessorDescriptor) as IrSimpleFunctionSymbol + moduleIndex.functions[accessorDescriptor]!!.symbol as IrSimpleFunctionSymbol } else -> super.getReferencedSimpleFunction(symbol)