@@ -143,11 +143,18 @@ def __str__(self):
143143
144144
145145class NestedField (object ):
146- def __init__ (self , name , comment ):
146+ def __init__ (self , name , comment , version ):
147147 self .name = name
148148 self .comment = comment .strip ()
149+ self .version = version
149150
150151 def __str__ (self ):
152+ if self .version :
153+ return "\n * ``%s`` :versionbadge:`clang-format %s`\n %s" % (
154+ self .name ,
155+ self .version ,
156+ doxygen2rst (indent (self .comment , 2 , indent_first_line = False )),
157+ )
151158 return "\n * ``%s`` %s" % (
152159 self .name ,
153160 doxygen2rst (indent (self .comment , 2 , indent_first_line = False )),
@@ -165,18 +172,28 @@ def __str__(self):
165172
166173
167174class NestedEnum (object ):
168- def __init__ (self , name , enumtype , comment , values ):
175+ def __init__ (self , name , enumtype , comment , version , values ):
169176 self .name = name
170177 self .comment = comment
171178 self .values = values
172179 self .type = enumtype
180+ self .version = version
173181
174182 def __str__ (self ):
175- s = "\n * ``%s %s``\n %s" % (
176- to_yaml_type (self .type ),
177- self .name ,
178- doxygen2rst (indent (self .comment , 2 )),
179- )
183+ s = ""
184+ if self .version :
185+ s = "\n * ``%s %s`` :versionbadge:`clang-format %s`\n \n %s" % (
186+ to_yaml_type (self .type ),
187+ self .name ,
188+ self .version ,
189+ doxygen2rst (indent (self .comment , 2 )),
190+ )
191+ else :
192+ s = "\n * ``%s %s``\n %s" % (
193+ to_yaml_type (self .type ),
194+ self .name ,
195+ doxygen2rst (indent (self .comment , 2 )),
196+ )
180197 s += indent ("\n Possible values:\n \n " , 2 )
181198 s += indent ("\n " .join (map (str , self .values )), 2 )
182199 return s
@@ -278,7 +295,9 @@ class State:
278295 InFieldComment ,
279296 InEnum ,
280297 InEnumMemberComment ,
281- ) = range (8 )
298+ InNestedEnum ,
299+ InNestedEnumMemberComment ,
300+ ) = range (10 )
282301
283302 state = State .BeforeStruct
284303
@@ -344,27 +363,38 @@ class State:
344363 state = State .InStruct
345364 nested_structs [nested_struct .name ] = nested_struct
346365 elif state == State .InNestedFieldComment :
347- if line .startswith ("///" ):
366+ if line .startswith (r"/// \version" ):
367+ match = re .match (r"/// \\version\s*(?P<version>[0-9.]+)*" , line )
368+ if match :
369+ version = match .group ("version" )
370+ elif line .startswith ("///" ):
348371 comment += self .__clean_comment_line (line )
372+ elif line .startswith ("enum" ):
373+ state = State .InNestedEnum
374+ name = re .sub (r"enum\s+(\w+)\s*(:((\s*\w+)+)\s*)?\{" , "\\ 1" , line )
375+ enum = Enum (name , comment )
349376 else :
350377 state = State .InNestedStruct
351378 field_type , field_name = re .match (
352379 r"([<>:\w(,\s)]+)\s+(\w+);" , line
353380 ).groups ()
381+ # if not version:
382+ # self.__warning(f"missing version for {field_name}", line)
354383 if field_type in enums :
355384 nested_struct .values .append (
356385 NestedEnum (
357386 field_name ,
358387 field_type ,
359388 comment ,
389+ version ,
360390 enums [field_type ].values ,
361391 )
362392 )
363393 else :
364394 nested_struct .values .append (
365- NestedField (field_type + " " + field_name , comment )
395+ NestedField (field_type + " " + field_name , comment , version )
366396 )
367-
397+ version = None
368398 elif state == State .InEnum :
369399 if line .startswith ("///" ):
370400 state = State .InEnumMemberComment
@@ -376,6 +406,17 @@ class State:
376406 # Enum member without documentation. Must be documented where the enum
377407 # is used.
378408 pass
409+ elif state == State .InNestedEnum :
410+ if line .startswith ("///" ):
411+ state = State .InNestedEnumMemberComment
412+ comment = self .__clean_comment_line (line )
413+ elif line == "};" :
414+ state = State .InNestedStruct
415+ enums [enum .name ] = enum
416+ else :
417+ # Enum member without documentation. Must be
418+ # documented where the enum is used.
419+ pass
379420 elif state == State .InEnumMemberComment :
380421 if line .startswith ("///" ):
381422 comment += self .__clean_comment_line (line )
@@ -389,6 +430,19 @@ class State:
389430 else :
390431 config = val
391432 enum .values .append (EnumValue (val , comment , config ))
433+ elif state == State .InNestedEnumMemberComment :
434+ if line .startswith ("///" ):
435+ comment += self .__clean_comment_line (line )
436+ else :
437+ state = State .InNestedEnum
438+ val = line .replace ("," , "" )
439+ pos = val .find (" // " )
440+ if pos != - 1 :
441+ config = val [pos + 4 :]
442+ val = val [:pos ]
443+ else :
444+ config = val
445+ enum .values .append (EnumValue (val , comment , config ))
392446 if state != State .Finished :
393447 raise Exception ("Not finished by the end of file" )
394448
0 commit comments