@@ -285,24 +285,21 @@ class ModelToKotlinCommonGenerator(
285285 ) {
286286 when (val fieldType = field.type) {
287287 is FieldType .IntegralType -> whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.${field.type.wireType.name} " ) {
288- val raw = " decoder.read${field.type.decodeEncodeFuncName()} ()"
289- code(" $lvalue = ${wrapperCtor(raw)} " )
288+ generateDecodeFieldValue(fieldType, lvalue, wrapperCtor = wrapperCtor)
290289 }
291290
292291 is FieldType .List -> if (field.dec.isPacked) {
293292 whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.LENGTH_DELIMITED" ) {
294- code( " $ lvalue = decoder.readPacked ${fieldType.value.decodeEncodeFuncName()} () " )
293+ generateDecodeFieldValue(fieldType, lvalue, isPacked = true , wrapperCtor = wrapperCtor )
295294 }
296295 } else {
297296 whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.${fieldType.value.wireType.name} " ) {
298- code( " (msg. ${field.name} as ArrayList).add(decoder.read ${fieldType.value.decodeEncodeFuncName()} ()) " )
297+ generateDecodeFieldValue(fieldType, lvalue, isPacked = false , wrapperCtor = wrapperCtor )
299298 }
300299 }
301300
302301 is FieldType .Enum -> whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.VARINT" ) {
303- val fromNum = " ${fieldType.dec.name.safeFullName()} .fromNumber"
304- val raw = " $fromNum (decoder.read${field.type.decodeEncodeFuncName()} ())"
305- code(" $lvalue = ${wrapperCtor(raw)} " )
302+ generateDecodeFieldValue(fieldType, lvalue, wrapperCtor = wrapperCtor)
306303 }
307304
308305 is FieldType .OneOf -> {
@@ -317,20 +314,71 @@ class ModelToKotlinCommonGenerator(
317314 }
318315
319316 is FieldType .Message -> {
320- val internalClassName = fieldType.dec.value.internalClassFullName()
321317 whenCase(" tag.fieldNr == ${field.number} && tag.wireType == $PB_PKG .WireType.LENGTH_DELIMITED" ) {
322318 // check if the the current sub message object
323319 ifBranch(condition = " !msg.presenceMask[${field.presenceIdx} ]" , ifBlock = {
324320 code(" $lvalue = ${fieldType.dec.value.internalClassFullName()} ()" )
325321 })
326- code( " decoder.readMessage( $ lvalue.asInternal(), $internalClassName ::decodeWith) " )
322+ generateDecodeFieldValue(fieldType, lvalue, wrapperCtor = wrapperCtor )
327323 }
328324 }
329325
330326 is FieldType .Map -> TODO ()
331327 }
332328 }
333329
330+ private fun CodeGenerator.generateDecodeFieldValue (
331+ fieldType : FieldType ,
332+ lvalue : String ,
333+ isPacked : Boolean = false,
334+ wrapperCtor : (String ) -> String = { it }
335+ ) {
336+ when (fieldType) {
337+ is FieldType .IntegralType -> {
338+ val raw = " decoder.read${fieldType.decodeEncodeFuncName()} ()"
339+ code(" $lvalue = ${wrapperCtor(raw)} " )
340+ }
341+
342+ is FieldType .List -> if (isPacked) {
343+ code(" $lvalue = decoder.readPacked${fieldType.value.decodeEncodeFuncName()} ()" )
344+ } else {
345+ when (val elemType = fieldType.value) {
346+ is FieldType .Message -> {
347+ code(" val elem = ${elemType.dec.value.internalClassFullName()} ()" )
348+ generateDecodeFieldValue(fieldType.value, " elem" , wrapperCtor = wrapperCtor)
349+ }
350+
351+ else -> generateDecodeFieldValue(fieldType.value, " val elem" , wrapperCtor = wrapperCtor)
352+ }
353+ code(" ($lvalue as ArrayList).add(elem)" )
354+ }
355+
356+ is FieldType .Enum -> {
357+ val fromNum = " ${fieldType.dec.name.safeFullName()} .fromNumber"
358+ val raw = " $fromNum (decoder.read${fieldType.decodeEncodeFuncName()} ())"
359+ code(" $lvalue = ${wrapperCtor(raw)} " )
360+ }
361+
362+ is FieldType .OneOf -> {
363+ fieldType.dec.variants.forEach { variant ->
364+ val variantName = " ${fieldType.dec.name.safeFullName()} .${variant.name} "
365+ readMatchCase(
366+ field = variant,
367+ lvalue = lvalue,
368+ wrapperCtor = { " $variantName ($it )" }
369+ )
370+ }
371+ }
372+
373+ is FieldType .Message -> {
374+ val internalClassName = fieldType.dec.value.internalClassFullName()
375+ code(" decoder.readMessage($lvalue .asInternal(), $internalClassName ::decodeWith)" )
376+ }
377+
378+ is FieldType .Map -> TODO ()
379+ }
380+ }
381+
334382 private fun CodeGenerator.generateMessageEncoder (declaration : MessageDeclaration ) = function(
335383 name = " encodeWith" ,
336384 modifiers = " internal" ,
@@ -374,7 +422,7 @@ class ModelToKotlinCommonGenerator(
374422 field.dec.isPacked && ! field.packedFixedSize ->
375423 code(
376424 " encoder.writePacked${encFunc!! } (fieldNr = $number , value = $valueVar , fieldSize = ${
377- field.valueSizeCall(valueVar)
425+ field.type. valueSizeCall(valueVar, number, true )
378426 } )"
379427 )
380428
@@ -500,7 +548,7 @@ class ModelToKotlinCommonGenerator(
500548
501549
502550 private fun CodeGenerator.generateFieldComputeSizeCall (field : FieldDeclaration , variable : String ) {
503- val valueSize by lazy { field.valueSizeCall(variable) }
551+ val valueSize by lazy { field.type. valueSizeCall(variable, field.number, field.dec.isPacked ) }
504552 val tagSize = tagSizeCall(field.number, field.type.wireType)
505553
506554 when (field.type) {
@@ -541,24 +589,20 @@ class ModelToKotlinCommonGenerator(
541589 }
542590 }
543591
544- private fun FieldDeclaration .valueSizeCall (variable : String ): String {
545- val sizeFunName = type. decodeEncodeFuncName()?.decapitalize()
592+ private fun FieldType .valueSizeCall (variable : String , number : Int , isPacked : Boolean = false ): String {
593+ val sizeFunName = decodeEncodeFuncName()?.decapitalize()
546594 val sizeFunc = " $PB_PKG .WireSize.$sizeFunName ($variable )"
547595
548- return when (type ) {
596+ return when (this ) {
549597 is FieldType .IntegralType -> sizeFunc
550598
551599 is FieldType .List -> when {
552- dec. isPacked -> sizeFunc
600+ isPacked -> sizeFunc
553601 else -> {
554602 // calculate the size of the values within the list.
555- val valueTypeSizeFunc = type.value.decodeEncodeFuncName()?.decapitalize()
556- " $variable .sumOf { $PB_PKG .WireSize.$valueTypeSizeFunc (it) + ${
557- tagSizeCall(
558- number,
559- type.value.wireType
560- )
561- } }"
603+ val valueSize = value.valueSizeCall(" it" , number)
604+ val tagSize = tagSizeCall(number, value.wireType)
605+ " $variable .sumOf { $valueSize + $tagSize }"
562606 }
563607 }
564608
0 commit comments