Native: fix using nested expect enum entry in a default argument

^KT-51156 Fixed
This commit is contained in:
Svyatoslav Scherbina
2022-02-09 14:41:11 +00:00
committed by Space
parent 0a85f0dd34
commit 62c1bd0044
11 changed files with 99 additions and 4 deletions
@@ -31,10 +31,16 @@ class ModuleIndex(val module: IrModuleFragment) {
*/
val properties: Map<PropertyDescriptor, IrProperty>
/**
* Contains all enum entries declared in [module]
*/
val enumEntries: Map<ClassDescriptor, IrEnumEntry>
init {
classes = mutableMapOf()
functions = mutableMapOf()
properties = mutableMapOf()
enumEntries = mutableMapOf()
module.acceptVoid(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) {
@@ -56,6 +62,11 @@ class ModuleIndex(val module: IrModuleFragment) {
super.visitProperty(declaration)
properties[declaration.descriptor] = declaration
}
override fun visitEnumEntry(declaration: IrEnumEntry) {
super.visitEnumEntry(declaration)
enumEntries[declaration.descriptor] = declaration
}
})
}
}
@@ -16,10 +16,7 @@ import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
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.patchDeclarationParents
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -101,6 +98,9 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr
private fun IrClass.findActualForExpected(): IrClass =
moduleIndex.classes[descriptor.findActualForExpect()]!!
private fun IrEnumEntry.findActualForExpected(): IrEnumEntry =
moduleIndex.enumEntries[descriptor.findActualForExpect()]!!
private inline fun <reified T : MemberDescriptor> T.findActualForExpect(): T {
if (!this.isExpect) error(this)
return (findCompatibleActualsForExpected(module).singleOrNull() ?: error(this)) as T
@@ -156,6 +156,12 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr
else
super.getReferencedProperty(symbol)
override fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol =
if (symbol.descriptor.isExpect)
symbol.owner.findActualForExpected().symbol
else
super.getReferencedEnumEntry(symbol)
override fun getReferencedValue(symbol: IrValueSymbol) =
remapExpectValue(symbol)?.symbol ?: super.getReferencedValue(symbol)
}