@@ -143,11 +143,18 @@ def __str__(self):
143
143
144
144
145
145
class NestedField (object ):
146
- def __init__ (self , name , comment ):
146
+ def __init__ (self , name , comment , version ):
147
147
self .name = name
148
148
self .comment = comment .strip ()
149
+ self .version = version
149
150
150
151
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
+ )
151
158
return "\n * ``%s`` %s" % (
152
159
self .name ,
153
160
doxygen2rst (indent (self .comment , 2 , indent_first_line = False )),
@@ -165,18 +172,28 @@ def __str__(self):
165
172
166
173
167
174
class NestedEnum (object ):
168
- def __init__ (self , name , enumtype , comment , values ):
175
+ def __init__ (self , name , enumtype , comment , version , values ):
169
176
self .name = name
170
177
self .comment = comment
171
178
self .values = values
172
179
self .type = enumtype
180
+ self .version = version
173
181
174
182
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
+ )
180
197
s += indent ("\n Possible values:\n \n " , 2 )
181
198
s += indent ("\n " .join (map (str , self .values )), 2 )
182
199
return s
@@ -278,7 +295,9 @@ class State:
278
295
InFieldComment ,
279
296
InEnum ,
280
297
InEnumMemberComment ,
281
- ) = range (8 )
298
+ InNestedEnum ,
299
+ InNestedEnumMemberComment ,
300
+ ) = range (10 )
282
301
283
302
state = State .BeforeStruct
284
303
@@ -344,27 +363,38 @@ class State:
344
363
state = State .InStruct
345
364
nested_structs [nested_struct .name ] = nested_struct
346
365
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 ("///" ):
348
371
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 )
349
376
else :
350
377
state = State .InNestedStruct
351
378
field_type , field_name = re .match (
352
379
r"([<>:\w(,\s)]+)\s+(\w+);" , line
353
380
).groups ()
381
+ # if not version:
382
+ # self.__warning(f"missing version for {field_name}", line)
354
383
if field_type in enums :
355
384
nested_struct .values .append (
356
385
NestedEnum (
357
386
field_name ,
358
387
field_type ,
359
388
comment ,
389
+ version ,
360
390
enums [field_type ].values ,
361
391
)
362
392
)
363
393
else :
364
394
nested_struct .values .append (
365
- NestedField (field_type + " " + field_name , comment )
395
+ NestedField (field_type + " " + field_name , comment , version )
366
396
)
367
-
397
+ version = None
368
398
elif state == State .InEnum :
369
399
if line .startswith ("///" ):
370
400
state = State .InEnumMemberComment
@@ -376,6 +406,17 @@ class State:
376
406
# Enum member without documentation. Must be documented where the enum
377
407
# is used.
378
408
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
379
420
elif state == State .InEnumMemberComment :
380
421
if line .startswith ("///" ):
381
422
comment += self .__clean_comment_line (line )
@@ -389,6 +430,19 @@ class State:
389
430
else :
390
431
config = val
391
432
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 ))
392
446
if state != State .Finished :
393
447
raise Exception ("Not finished by the end of file" )
394
448
0 commit comments