Skip to content

Commit 62edb4c

Browse files
committed
fix(model-api-gen): use ids for enum deserialization
Fixes MODELIX-458 (https://issues.modelix.org/issue/MODELIX-458)
1 parent 9fbe48f commit 62edb4c

File tree

3 files changed

+35
-6
lines changed

3 files changed

+35
-6
lines changed

model-api-gen-runtime/src/commonMain/kotlin/org/modelix/metamodel/IPropertyValueSerializer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ class MandatoryEnumSerializer<E : Enum<*>>(private val valueOf: (String?) -> E)
8484
}
8585

8686
override fun deserialize(serialized: String?): E {
87-
return valueOf(serialized)
87+
val id = serialized?.substringBefore('/')
88+
return valueOf(id)
8889
}
8990
}
9091

model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/GeneratorInput.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ internal class ProcessedLanguage(var name: String, var uid: String?) {
168168
for (data in dataList) {
169169
val enum = ProcessedEnum(data.name, data.uid, maxOf(0, data.defaultIndex))
170170
for (memberData in data.members) {
171-
val member = ProcessedEnumMember(memberData.name, memberData.uid)
171+
val member = ProcessedEnumMember(memberData.name, memberData.uid, memberData.memberId, memberData.presentation)
172172
enum.addMember(member)
173173
}
174174
addEnum(enum)
@@ -196,7 +196,7 @@ internal class ProcessedEnum(var name: String, var uid: String?, var defaultInde
196196
}
197197
}
198198

199-
internal class ProcessedEnumMember(var name: String, var uid: String?) {
199+
internal class ProcessedEnumMember(var name: String, var uid: String?, var memberId: String, var presentation: String?) {
200200
lateinit var enum: ProcessedEnum
201201
}
202202

model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/MetaModelGenerator.kt

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,43 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
117117
private fun generateEnumFile(enum: ProcessedEnum) {
118118
val builder = TypeSpec.enumBuilder(enum.name)
119119

120+
builder.primaryConstructor(
121+
FunSpec.constructorBuilder()
122+
.addParameter("presentation", String::class.asTypeName().copy(nullable = true))
123+
.build()
124+
)
125+
126+
val getLiteralFunBuilder = FunSpec.builder("getLiteralByMemberId")
127+
.addParameter("memberId", String::class)
128+
val getLiteralCodeBuilder = CodeBlock.builder().beginControlFlow("return when (memberId) {")
129+
120130
for (member in enum.getAllMembers()) {
121-
builder.addEnumConstant(member.name)
131+
builder.addEnumConstant(
132+
member.name,
133+
TypeSpec.anonymousClassBuilder()
134+
.addSuperclassConstructorParameter(
135+
if (member.presentation == null) "null" else "%S",
136+
member.presentation ?: "")
137+
.build()
138+
)
139+
getLiteralCodeBuilder.addStatement("%S -> %L", member.memberId, member.name)
122140
}
123141

142+
getLiteralFunBuilder.addCode(
143+
getLiteralCodeBuilder
144+
.addStatement("else -> defaultValue()")
145+
.endControlFlow()
146+
.build()
147+
)
148+
124149
val companion = TypeSpec.companionObjectBuilder()
125150
.addFunction(
126151
FunSpec.builder("defaultValue")
127152
.addCode("return values()[%L]", enum.defaultIndex)
128153
.build())
154+
.addFunction(
155+
getLiteralFunBuilder.build()
156+
)
129157
.build()
130158

131159
val generatedEnum = builder.addType(companion).build()
@@ -317,7 +345,7 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
317345
if (feature.type is EnumPropertyType) {
318346
if (serializer == MandatoryEnumSerializer::class.asTypeName()) {
319347
propBuilder.initializer(
320-
"""newProperty(%S, %S, %T { if (it != null) %T.valueOf(it) else %T.defaultValue() }, ${feature.optional})""",
348+
"""newProperty(%S, %S, %T { if (it != null) %T.getLiteralByMemberId(it) else %T.defaultValue() }, ${feature.optional})""",
321349
feature.originalName,
322350
feature.uid,
323351
serializer,
@@ -326,7 +354,7 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
326354
)
327355
} else {
328356
propBuilder.initializer(
329-
"""newProperty(%S, %S, %T { %T.valueOf(it) }, ${feature.optional})""",
357+
"""newProperty(%S, %S, %T { %T.getLiteralByMemberId(it) }, ${feature.optional})""",
330358
feature.originalName,
331359
feature.uid,
332360
serializer,

0 commit comments

Comments
 (0)