@@ -316,39 +316,27 @@ def _get_stub(cls: schema.Class, base_import: str, generated_import_prefix: str)
316
316
ql_internal = "ql_internal" in cls .pragmas )
317
317
318
318
319
- def _patch_class_qldocs (cls : str , qldoc : str , stub_file : pathlib .Path ):
319
+ _stub_qldoc_header = "// the following QLdoc is generated: if you need to edit it, do it in the schema file\n "
320
+
321
+ _class_qldoc_re = re .compile (rf"(?P<qldoc>(?:{ _stub_qldoc_header } )?/\*\*.*?\*/\s*|^\s*)class\s+(?P<class>\w+)" ,
322
+ re .MULTILINE | re .DOTALL )
323
+
324
+
325
+ def _patch_class_qldoc (cls : str , qldoc : str , stub_file : pathlib .Path ):
320
326
if not qldoc or not stub_file .exists ():
321
327
return
322
328
qldoc = "\n " .join (l .rstrip () for l in qldoc .splitlines ())
323
- tmp = stub_file .with_suffix (f'{ stub_file .suffix } .bkp' )
324
- header = "// the following QLdoc is generated: if you need to edit it, do it in the schema file\n "
325
329
with open (stub_file ) as input :
326
- qldoc_start = None
327
- qldoc_end = None
328
- class_start = None
329
- for lineno , line in enumerate (input , 1 ):
330
- if line == header :
331
- qldoc_start = lineno
332
- if line .startswith ("/**" ) and lineno - 1 != qldoc_start :
333
- qldoc_start = lineno
334
- if line .endswith (" */\n " ):
335
- qldoc_end = lineno + 1
336
- elif line .startswith (f"class { cls } " ):
337
- class_start = lineno
338
- break
339
- assert class_start , stub_file
340
- assert bool (qldoc_start ) == bool (qldoc_end ), stub_file
341
- if not qldoc_start or qldoc_end != class_start :
342
- qldoc_start = class_start
343
- input .seek (0 )
344
- with open (tmp , 'w' ) as output :
345
- for lineno , line in enumerate (input , 1 ):
346
- if lineno == qldoc_start :
347
- print (header , end = '' , file = output )
348
- print (qldoc , file = output )
349
- if lineno < qldoc_start or lineno >= class_start :
350
- print (line , end = '' , file = output )
351
- tmp .rename (stub_file )
330
+ contents = input .read ()
331
+ for match in _class_qldoc_re .finditer (contents ):
332
+ if match ["class" ] == cls :
333
+ qldoc_start , qldoc_end = match .span ("qldoc" )
334
+ contents = f"{ contents [:qldoc_start ]} { _stub_qldoc_header } { qldoc } \n { contents [qldoc_end :]} "
335
+ tmp = stub_file .with_suffix (f"{ stub_file .suffix } .bkp" )
336
+ with open (tmp , "w" ) as out :
337
+ out .write (contents )
338
+ tmp .rename (stub_file )
339
+ return
352
340
353
341
354
342
def generate (opts , renderer ):
@@ -404,7 +392,7 @@ def generate(opts, renderer):
404
392
renderer .render (stub , stub_file )
405
393
else :
406
394
qldoc = renderer .render_str (stub , template = 'ql_stub_class_qldoc' )
407
- _patch_class_qldocs (c .name , qldoc , stub_file )
395
+ _patch_class_qldoc (c .name , qldoc , stub_file )
408
396
409
397
# for example path/to/elements -> path/to/elements.qll
410
398
renderer .render (ql .ImportList ([i for name , i in imports .items () if not classes [name ].ql_internal ]),
0 commit comments