@@ -56,6 +56,16 @@ def name_for(desc: Descriptor) -> str:
5656 return desc .full_name .replace ("." , "_" )
5757
5858
59+ def field_is_repeated (field : FieldDescriptor ) -> bool :
60+ return bool (
61+ getattr (
62+ field ,
63+ "is_repeated" ,
64+ getattr (field , "label" ) == FieldDescriptor .LABEL_REPEATED ,
65+ )
66+ )
67+
68+
5969def emit_loop (
6070 field_name : str ,
6171 iter_expr : str ,
@@ -290,17 +300,16 @@ def walk(self, desc: Descriptor) -> bool:
290300 continue
291301
292302 # Repeated fields (including maps which are represented as repeated messages)
293- if field .label == FieldDescriptor .LABEL_REPEATED :
294- if (
295- field .message_type is not None
296- and field .message_type .GetOptions ().map_entry
297- ):
298- val_fd = field .message_type .fields_by_name .get ("value" )
303+ if field_is_repeated (field ):
304+ message_type = field .message_type
305+ if message_type is not None and message_type .GetOptions ().map_entry :
306+ val_fd = message_type .fields_by_name .get ("value" )
299307 if (
300308 val_fd is not None
301309 and val_fd .type == FieldDescriptor .TYPE_MESSAGE
302310 ):
303311 child_desc = val_fd .message_type
312+ assert child_desc is not None
304313 child_needed = self .walk (child_desc )
305314 if child_needed :
306315 has_payload = True
@@ -313,12 +322,13 @@ def walk(self, desc: Descriptor) -> bool:
313322 )
314323 )
315324
316- key_fd = field . message_type .fields_by_name .get ("key" )
325+ key_fd = message_type .fields_by_name .get ("key" )
317326 if (
318327 key_fd is not None
319328 and key_fd .type == FieldDescriptor .TYPE_MESSAGE
320329 ):
321330 child_desc = key_fd .message_type
331+ assert child_desc is not None
322332 child_needed = self .walk (child_desc )
323333 if child_needed :
324334 has_payload = True
@@ -331,14 +341,16 @@ def walk(self, desc: Descriptor) -> bool:
331341 )
332342 )
333343 else :
344+ assert message_type is not None
334345 item = self ._collect_repeated (
335- field . message_type , field , f"o.{ field .name } "
346+ message_type , field , f"o.{ field .name } "
336347 )
337348 if item is not None :
338349 has_payload = True
339350 emit_items .append (item )
340351 else :
341352 child_desc = field .message_type
353+ assert child_desc is not None
342354 child_has_payload = self .walk (child_desc )
343355 has_payload |= child_has_payload
344356 if child_has_payload :
@@ -358,6 +370,7 @@ def walk(self, desc: Descriptor) -> bool:
358370 first = True
359371 for field in fields :
360372 child_desc = field .message_type
373+ assert child_desc is not None
361374 child_has_payload = self .walk (child_desc )
362375 has_payload |= child_has_payload
363376 if child_has_payload :
0 commit comments