Skip to content

Commit

Permalink
Populate EnumType literals
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Dec 15, 2024
1 parent 3c57815 commit f8891a3
Showing 1 changed file with 20 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
import org.jetbrains.kotlin.backend.jvm.codegen.AnnotationCodegen.Companion.annotationClass
import org.jetbrains.kotlin.backend.jvm.functionByName
import org.jetbrains.kotlin.backend.jvm.ir.findEnumValuesFunction
import org.jetbrains.kotlin.cli.common.messages.MessageCollector
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
Expand All @@ -38,6 +39,7 @@ import org.jetbrains.kotlin.ir.builders.irString
import org.jetbrains.kotlin.ir.declarations.IrAnonymousInitializer
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrEnumEntry
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
Expand All @@ -57,6 +59,7 @@ import org.jetbrains.kotlin.ir.types.toKotlinType
import org.jetbrains.kotlin.ir.types.typeOrNull
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET
import org.jetbrains.kotlin.ir.util.allParameters
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.functions
import org.jetbrains.kotlin.ir.util.kotlinFqName
Expand Down Expand Up @@ -111,13 +114,30 @@ class LanguageIrGenerationExtension(

// We add the enums
enumClasses.forEach { enumClass ->
val arrayListConstructor = pluginContext.referenceConstructors(ArrayList::class.classId).find {
it.owner.valueParameters.isEmpty()
}!!
val literals =
createTmpVariable(
irCallConstructor(arrayListConstructor, emptyList()).apply {
},
)
enumClass.declarations.filterIsInstance<IrEnumEntry>().forEach { entry ->
+irCall(addMethod).apply {
dispatchReceiver = irGet(literals)
putValueArgument(0, irString(entry.name.identifier))
}
}

val enumTypeConstructor = pluginContext.referenceConstructors(EnumType::class.classId).first()
val enumTypeInstance =
createTmpVariable(
irCallConstructor(enumTypeConstructor, emptyList()).apply {
putValueArgument(0, irString(enumClass.name.identifier))
putValueArgument(1, irGet(literals))
},
)

+irCall(addMethod).apply {
dispatchReceiver =
irCall(types.getter!!).apply {
Expand Down

0 comments on commit f8891a3

Please sign in to comment.