@@ -94,20 +94,30 @@ class ModelToKotlinCommonGenerator(
94
94
}
95
95
96
96
private fun CodeGenerator.generateInternalDeclaredEntities (fileDeclaration : FileDeclaration ) {
97
- fileDeclaration.messageDeclarations.forEach { generateInternalMessage(it) }
97
+ generateInternalMessageEntities( fileDeclaration.messageDeclarations)
98
98
99
- fileDeclaration.messageDeclarations.forEach {
99
+ val allEnums =
100
+ fileDeclaration.enumDeclarations + fileDeclaration.messageDeclarations.flatMap { it.allEnumsRecursively() }
101
+ allEnums.forEach { enum ->
102
+ generateInternalEnumConstructor(enum)
103
+ }
104
+ }
105
+
106
+ private fun CodeGenerator.generateInternalMessageEntities (messages : List <MessageDeclaration >) {
107
+ messages.forEach { generateInternalMessage(it) }
108
+
109
+ messages.forEach {
100
110
generateMessageConstructor(it)
101
111
}
102
112
103
- fileDeclaration.messageDeclarations .forEach {
113
+ messages .forEach {
104
114
generateRequiredCheck(it)
105
115
generateMessageEncoder(it)
106
116
generateMessageDecoder(it)
107
117
}
108
-
109
118
}
110
119
120
+
111
121
private fun MessageDeclaration.fields () = actualFields.map {
112
122
it.transformToFieldDeclaration() to it
113
123
}
@@ -287,6 +297,11 @@ class ModelToKotlinCommonGenerator(
287
297
}
288
298
}
289
299
300
+ is FieldType .Enum -> whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.VARINT" ) {
301
+ val fromNum = " ${fieldType.dec.name.safeFullName()} .fromNumber"
302
+ code(" $assignment $fromNum (decoder.read$encFuncName ())" )
303
+ }
304
+
290
305
is FieldType .Map -> TODO ()
291
306
is FieldType .OneOf -> TODO ()
292
307
is FieldType .Reference -> TODO ()
@@ -338,13 +353,32 @@ class ModelToKotlinCommonGenerator(
338
353
" $variable .forEach { encoder.write${fieldType.value.decodeEncodeFuncName()} ($number , it) }"
339
354
}
340
355
356
+ is FieldType .Enum -> " encoder.write${type.decodeEncodeFuncName()} (fieldNr = $number , value = $variable .number)"
357
+
341
358
is FieldType .Map -> TODO ()
342
359
is FieldType .OneOf -> TODO ()
343
- is FieldType .Reference -> TODO ()
360
+ is FieldType .Reference -> " < TODO: Implement Reference writeValue()> "
344
361
}
345
362
}
346
363
347
364
365
+ private fun CodeGenerator.generateInternalEnumConstructor (enum : EnumDeclaration ) {
366
+ function(
367
+ " fromNumber" ,
368
+ modifiers = " private" ,
369
+ args = " number: Int" ,
370
+ contextReceiver = " ${enum.name.safeFullName()} .Companion" ,
371
+ returnType = enum.name.safeFullName(),
372
+ ) {
373
+ scope(" for (entry in entries)" ) {
374
+ ifBranch(condition = " entry.number == number" , ifBlock = {
375
+ code(" return entry" )
376
+ })
377
+ }
378
+ code(" return ${enum.name.safeFullName()} .UNRECOGNIZED(number)" )
379
+ }
380
+ }
381
+
348
382
/* *
349
383
* Generates a function to check for the presence of all required fields in a message declaration.
350
384
*/
@@ -383,6 +417,7 @@ class ModelToKotlinCommonGenerator(
383
417
else -> error(" Unexpected use of size call for field: $name , type: $fieldType " )
384
418
}
385
419
420
+ is FieldType .Enum -> sizeFunc
386
421
is FieldType .Map -> TODO ()
387
422
is FieldType .OneOf -> TODO ()
388
423
is FieldType .Reference -> TODO ()
@@ -397,6 +432,9 @@ class ModelToKotlinCommonGenerator(
397
432
}
398
433
399
434
is FieldType .List -> " $name .isNotEmpty()"
435
+ is FieldType .Reference -> " <TODO: Implement Reference defaultCheck>"
436
+
437
+ is FieldType .Enum -> " ${fieldType.defaultValue} != $name "
400
438
401
439
else -> TODO (" Field: $name , type: $fieldType " )
402
440
}
@@ -419,6 +457,7 @@ class ModelToKotlinCommonGenerator(
419
457
FieldType .IntegralType .SFIXED32 -> " SFixed32"
420
458
FieldType .IntegralType .SFIXED64 -> " SFixed64"
421
459
is FieldType .List -> " Packed${value.decodeEncodeFuncName()} "
460
+ is FieldType .Enum -> " Enum"
422
461
is FieldType .Map -> error(" No encoding/decoding function for map types" )
423
462
is FieldType .OneOf -> error(" No encoding/decoding function for oneOf types" )
424
463
is FieldType .Reference -> error(" No encoding/decoding function for sub message types" )
@@ -435,6 +474,8 @@ class ModelToKotlinCommonGenerator(
435
474
value.safeFullName()
436
475
}
437
476
477
+ is FieldType .Enum -> type.dec.name.safeFullName()
478
+
438
479
is FieldType .OneOf -> {
439
480
val value by type.value
440
481
value.safeFullName()
@@ -471,6 +512,7 @@ class ModelToKotlinCommonGenerator(
471
512
472
513
" Map<${fqKey.safeFullName()} , ${fqValue.safeFullName()} >"
473
514
}
515
+
474
516
}.withNullability(nullable)
475
517
}
476
518
@@ -497,24 +539,44 @@ class ModelToKotlinCommonGenerator(
497
539
}
498
540
499
541
private fun CodeGenerator.generatePublicEnum (declaration : EnumDeclaration ) {
500
- clazz(declaration.name.simpleName, modifiers = " enum" ) {
501
- declaration.originalEntries.forEach { entry ->
502
- code(" ${entry.name.simpleName} ," )
503
- newLine()
542
+
543
+ val className = declaration.name.simpleName
544
+
545
+ val entriesSorted = declaration.originalEntries.sortedBy { it.dec.number }
546
+
547
+ clazz(
548
+ className, " sealed" ,
549
+ constructorArgs = listOf (" val number: Int" ),
550
+ ) {
551
+
552
+ declaration.originalEntries.forEach { variant ->
553
+ clazz(
554
+ name = variant.name.simpleName,
555
+ declarationType = DeclarationType .Object ,
556
+ superTypes = listOf (" $className (number = ${variant.dec.number} )" ),
557
+ )
504
558
}
505
- code(" ;" )
506
- newLine()
559
+
560
+ // TODO: Avoid name conflict
561
+ clazz(
562
+ name = " UNRECOGNIZED" ,
563
+ constructorArgs = listOf (" number: Int" ),
564
+ superTypes = listOf (" $className (number)" ),
565
+ )
507
566
508
567
if (declaration.aliases.isNotEmpty()) {
509
568
newLine()
510
569
511
570
clazz(" " , modifiers = " companion" , declarationType = DeclarationType .Object ) {
512
571
declaration.aliases.forEach { alias: EnumDeclaration .Alias ->
513
572
code(
514
- " val ${alias.name.simpleName} : ${declaration.name.simpleName} " +
573
+ " val ${alias.name.simpleName} : $className " +
515
574
" = ${alias.original.name.simpleName} "
516
575
)
517
576
}
577
+
578
+ val entryNamesSorted = entriesSorted.joinToString(" , " ) { it.name.simpleName }
579
+ code(" val entries: List<$className > = listOf($entryNamesSorted )" )
518
580
}
519
581
}
520
582
}
@@ -569,6 +631,8 @@ class ModelToKotlinCommonGenerator(
569
631
}
570
632
}
571
633
634
+ private fun MessageDeclaration.allEnumsRecursively (): List <EnumDeclaration > =
635
+ enumDeclarations + nestedDeclarations.flatMap(MessageDeclaration ::allEnumsRecursively)
572
636
573
637
private fun String.packageNameSuffixed (suffix : String ): String {
574
638
return if (isEmpty()) suffix else " $this .$suffix "
0 commit comments