Native: fix bug in KType support affecting only stdlib

Don't use IrClass.declarations to find enum entries during lowerings,
because this enum might already be lowered and thus have all entries
removed.
This commit is contained in:
Svyatoslav Scherbina
2021-03-22 12:00:48 +03:00
parent 886e3e6655
commit 818659f2bb
2 changed files with 15 additions and 10 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.COROUTINE_SUSPENDED_NAME
import org.jetbrains.kotlin.backend.common.ir.Ir
import org.jetbrains.kotlin.backend.common.ir.Symbols
import org.jetbrains.kotlin.backend.konan.*
import org.jetbrains.kotlin.backend.konan.descriptors.enumEntries
import org.jetbrains.kotlin.backend.konan.descriptors.kotlinNativeInternal
import org.jetbrains.kotlin.backend.konan.llvm.findMainEntryPoint
import org.jetbrains.kotlin.backend.konan.lower.TestProcessor
@@ -23,6 +24,7 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
@@ -455,6 +457,14 @@ internal class KonanSymbols(
val kType = symbolTable.referenceClass(context.reflectionTypes.kType)
val kVariance = symbolTable.referenceClass(context.reflectionTypes.kVariance)
val kVarianceIn = getKVarianceEnumEntry("IN")
val kVarianceOut = getKVarianceEnumEntry("OUT")
val kVarianceInvariant = getKVarianceEnumEntry("INVARIANT")
private fun getKVarianceEnumEntry(name: String): IrEnumEntrySymbol {
val descriptor = context.reflectionTypes.kVariance.enumEntries.single { it.name.asString() == name }
return symbolTable.referenceEnumEntry(descriptor)
}
val getClassTypeInfo = internalFunction("getClassTypeInfo")
val getObjectTypeInfo = internalFunction("getObjectTypeInfo")
@@ -126,20 +126,15 @@ internal class KTypeGenerator(
else -> parent.fqNameForIrSerialization.asString()
}
private val Variance.kVarianceName: String
get() = when (this) {
Variance.INVARIANT -> "INVARIANT"
Variance.IN_VARIANCE -> "IN"
Variance.OUT_VARIANCE -> "OUT"
}
private fun IrBuilderWithScope.irKVariance(variance: Variance) =
IrGetEnumValueImpl(
startOffset, endOffset,
symbols.kVariance.defaultType,
symbols.kVariance.owner.declarations
.filterIsInstance<IrEnumEntry>()
.single { it.name.asString() == variance.kVarianceName }.symbol
when (variance) {
Variance.INVARIANT -> symbols.kVarianceInvariant
Variance.IN_VARIANCE -> symbols.kVarianceIn
Variance.OUT_VARIANCE -> symbols.kVarianceOut
}
)
private fun <T> IrBuilderWithScope.irKTypeLikeList(