JVM IR: Remove varargs from EnumClassLowering
This commit is contained in:
committed by
max-kammerer
parent
8d9f2f4238
commit
4cef1c4901
+13
-37
@@ -7,13 +7,16 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
|||||||
|
|
||||||
import gnu.trove.TObjectIntHashMap
|
import gnu.trove.TObjectIntHashMap
|
||||||
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedClassConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedFieldDescriptor
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedFieldDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor
|
||||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||||
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
|
||||||
|
import org.jetbrains.kotlin.backend.jvm.ir.irArray
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -27,12 +30,13 @@ import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
|||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.typeWith
|
||||||
import org.jetbrains.kotlin.ir.util.*
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.TypeProjectionImpl
|
||||||
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
internal val enumClassPhase = makeIrFilePhase(
|
internal val enumClassPhase = makeIrFilePhase(
|
||||||
@@ -53,34 +57,6 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
|
|||||||
fun transform(delegatingConstructorCall: IrDelegatingConstructorCall): IrExpression
|
fun transform(delegatingConstructorCall: IrDelegatingConstructorCall): IrExpression
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createArrayOfExpression(arrayElementType: IrSimpleType, arrayElements: List<IrExpression>): IrExpression {
|
|
||||||
val arrayOfFun = context.ir.symbols.arrayOf.owner
|
|
||||||
|
|
||||||
/* Substituted descriptor is only needed to construct IrCall */
|
|
||||||
val unsubstitutedArrayOfFunDescriptor = arrayOfFun.descriptor
|
|
||||||
val typeParameter0 = unsubstitutedArrayOfFunDescriptor.typeParameters[0]
|
|
||||||
val typeSubstitutor = TypeSubstitutor.create(
|
|
||||||
mapOf(typeParameter0.typeConstructor to TypeProjectionImpl(arrayElementType.toKotlinType()))
|
|
||||||
)
|
|
||||||
val substitutedArrayOfDescriptor = unsubstitutedArrayOfFunDescriptor.substitute(typeSubstitutor)!!
|
|
||||||
|
|
||||||
val arrayType = context.irBuiltIns.arrayClass.typeWith(arrayElementType)
|
|
||||||
val arg0 =
|
|
||||||
IrVarargImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, arrayType, arrayElementType, arrayElements)
|
|
||||||
|
|
||||||
return IrCallImpl(
|
|
||||||
UNDEFINED_OFFSET,
|
|
||||||
UNDEFINED_OFFSET,
|
|
||||||
arrayType,
|
|
||||||
arrayOfFun.symbol,
|
|
||||||
substitutedArrayOfDescriptor,
|
|
||||||
arrayOfFun.typeParameters.size
|
|
||||||
).apply {
|
|
||||||
putTypeArgument(0, arrayElementType)
|
|
||||||
putValueArgument(0, arg0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private inner class EnumClassTransformer(val irClass: IrClass) {
|
private inner class EnumClassTransformer(val irClass: IrClass) {
|
||||||
private val enumEntryOrdinals = TObjectIntHashMap<IrEnumEntry>()
|
private val enumEntryOrdinals = TObjectIntHashMap<IrEnumEntry>()
|
||||||
private val enumEntryClassToEntry = HashMap<IrClass, IrEnumEntry>()
|
private val enumEntryClassToEntry = HashMap<IrClass, IrEnumEntry>()
|
||||||
@@ -271,11 +247,11 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun createSyntheticValuesFieldInitializerExpression(): IrExpression =
|
private fun createSyntheticValuesFieldInitializerExpression(): IrExpression =
|
||||||
createArrayOfExpression(
|
context.createJvmIrBuilder(irClass.symbol).irArray(context.irBuiltIns.arrayClass.typeWith(irClass.defaultType)) {
|
||||||
irClass.defaultType,
|
enumEntryFields.forEach { irField ->
|
||||||
enumEntryFields.map { irField ->
|
+IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irField.symbol, irField.symbol.owner.type)
|
||||||
IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irField.symbol, irField.symbol.owner.type)
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
private fun lowerEnumClassBody() {
|
private fun lowerEnumClassBody() {
|
||||||
irClass.transformChildrenVoid(EnumClassBodyTransformer())
|
irClass.transformChildrenVoid(EnumClassBodyTransformer())
|
||||||
|
|||||||
Reference in New Issue
Block a user