Skip to content

Commit 7c5acb9

Browse files
committed
code_clean: fix regex matching an ambiguous number of brackets
`use_elem_macro` and `use_str_elem_macro` were matching all brackets, this caused them to match unbalanced number of brackets, creating invalid syntax.
1 parent 6991711 commit 7c5acb9

File tree

1 file changed

+119
-113
lines changed

1 file changed

+119
-113
lines changed

Diff for: utils_maintenance/code_clean.py

+119-113
Original file line numberDiff line numberDiff line change
@@ -406,60 +406,63 @@ class use_elem_macro(EditGenerator):
406406
def edit_list_from_file(_source: str, data: str, _shared_edit_data: Any) -> List[Edit]:
407407
edits = []
408408

409-
test_equal = (
410-
r'[\(]*'
411-
r'([^\|\(\)]+)' # group 1 (no (|))
412-
r'\s+==\s+'
413-
r'([^\|\(\)]+)' # group 2 (no (|))
414-
r'[\)]*'
415-
)
409+
for use_brackets in (True, False):
416410

417-
test_not_equal = (
418-
r'[\(]*'
419-
r'([^\|\(\)]+)' # group 1 (no (|))
420-
r'\s+!=\s+'
421-
r'([^\|\(\)]+)' # group 2 (no (|))
422-
r'[\)]*'
423-
)
411+
test_equal = (
412+
r'([^\|\(\)]+)' # group 1 (no (|))
413+
r'\s+==\s+'
414+
r'([^\|\(\)]+)' # group 2 (no (|))
415+
)
416+
417+
test_not_equal = (
418+
r'([^\|\(\)]+)' # group 1 (no (|))
419+
r'\s+!=\s+'
420+
r'([^\|\(\)]+)' # group 2 (no (|))
421+
)
424422

425-
for is_equal in (True, False):
426-
for n in reversed(range(2, 64)):
427-
if is_equal:
428-
re_str = r'\(' + r'\s+\|\|\s+'.join([test_equal] * n) + r'\)'
429-
else:
430-
re_str = r'\(' + r'\s+\&\&\s+'.join([test_not_equal] * n) + r'\)'
431-
432-
for match in re.finditer(re_str, data):
433-
var = match.group(1)
434-
var_rest = []
435-
groups = match.groups()
436-
groups_paired = [(groups[i * 2], groups[i * 2 + 1]) for i in range(len(groups) // 2)]
437-
found = True
438-
for a, b in groups_paired:
439-
# Unlikely but possible the checks are swapped.
440-
if b == var and a != var:
441-
a, b = b, a
442-
443-
if a != var:
444-
found = False
445-
break
446-
var_rest.append(b)
447-
448-
if found:
449-
edits.append(Edit(
450-
span=match.span(),
451-
content='(%sELEM(%s, %s))' % (
452-
('' if is_equal else '!'),
453-
var,
454-
', '.join(var_rest),
455-
),
456-
# Use same expression otherwise this can change values inside assert when it shouldn't.
457-
content_fail='(%s__ALWAYS_FAIL__(%s, %s))' % (
458-
('' if is_equal else '!'),
459-
var,
460-
', '.join(var_rest),
461-
),
462-
))
423+
if use_brackets:
424+
test_equal = r'\(' + test_equal + r'\)'
425+
test_not_equal = r'\(' + test_not_equal + r'\)'
426+
427+
for is_equal in (True, False):
428+
for n in reversed(range(2, 64)):
429+
if is_equal:
430+
re_str = r'\(' + r'\s+\|\|\s+'.join([test_equal] * n) + r'\)'
431+
else:
432+
re_str = r'\(' + r'\s+\&\&\s+'.join([test_not_equal] * n) + r'\)'
433+
434+
for match in re.finditer(re_str, data):
435+
var = match.group(1)
436+
var_rest = []
437+
groups = match.groups()
438+
groups_paired = [(groups[i * 2], groups[i * 2 + 1]) for i in range(len(groups) // 2)]
439+
found = True
440+
for a, b in groups_paired:
441+
# Unlikely but possible the checks are swapped.
442+
if b == var and a != var:
443+
a, b = b, a
444+
445+
if a != var:
446+
found = False
447+
break
448+
var_rest.append(b)
449+
450+
if found:
451+
edits.append(Edit(
452+
span=match.span(),
453+
content='(%sELEM(%s, %s))' % (
454+
('' if is_equal else '!'),
455+
var,
456+
', '.join(var_rest),
457+
),
458+
# Use same expression otherwise this can change values
459+
# inside assert when it shouldn't.
460+
content_fail='(%s__ALWAYS_FAIL__(%s, %s))' % (
461+
('' if is_equal else '!'),
462+
var,
463+
', '.join(var_rest),
464+
),
465+
))
463466

464467
return edits
465468

@@ -476,69 +479,72 @@ class use_str_elem_macro(EditGenerator):
476479
def edit_list_from_file(_source: str, data: str, _shared_edit_data: Any) -> List[Edit]:
477480
edits = []
478481

479-
test_equal = (
480-
r'[\(]*'
481-
r'STREQ'
482-
r'\('
483-
r'([^\|\(\),]+)' # group 1 (no (|,))
484-
r',\s+'
485-
r'([^\|\(\),]+)' # group 2 (no (|,))
486-
r'\)'
487-
r'[\)]*'
488-
)
482+
for use_brackets in (True, False):
489483

490-
test_not_equal = (
491-
r'[\(]*'
492-
'!' # Only difference.
493-
r'STREQ'
494-
r'\('
495-
r'([^\|\(\),]+)' # group 1 (no (|,))
496-
r',\s+'
497-
r'([^\|\(\),]+)' # group 2 (no (|,))
498-
r'\)'
499-
r'[\)]*'
500-
)
484+
test_equal = (
485+
r'STREQ'
486+
r'\('
487+
r'([^\|\(\),]+)' # group 1 (no (|,))
488+
r',\s+'
489+
r'([^\|\(\),]+)' # group 2 (no (|,))
490+
r'\)'
491+
)
492+
493+
test_not_equal = (
494+
'!' # Only difference.
495+
r'STREQ'
496+
r'\('
497+
r'([^\|\(\),]+)' # group 1 (no (|,))
498+
r',\s+'
499+
r'([^\|\(\),]+)' # group 2 (no (|,))
500+
r'\)'
501+
)
501502

502-
for is_equal in (True, False):
503-
for n in reversed(range(2, 64)):
504-
if is_equal:
505-
re_str = r'\(' + r'\s+\|\|\s+'.join([test_equal] * n) + r'\)'
506-
else:
507-
re_str = r'\(' + r'\s+\&\&\s+'.join([test_not_equal] * n) + r'\)'
508-
509-
for match in re.finditer(re_str, data):
510-
if _source == '/src/blender/source/blender/editors/mesh/editmesh_extrude_spin.c':
511-
print(match.groups())
512-
var = match.group(1)
513-
var_rest = []
514-
groups = match.groups()
515-
groups_paired = [(groups[i * 2], groups[i * 2 + 1]) for i in range(len(groups) // 2)]
516-
found = True
517-
for a, b in groups_paired:
518-
# Unlikely but possible the checks are swapped.
519-
if b == var and a != var:
520-
a, b = b, a
521-
522-
if a != var:
523-
found = False
524-
break
525-
var_rest.append(b)
526-
527-
if found:
528-
edits.append(Edit(
529-
span=match.span(),
530-
content='(%sSTR_ELEM(%s, %s))' % (
531-
('' if is_equal else '!'),
532-
var,
533-
', '.join(var_rest),
534-
),
535-
# Use same expression otherwise this can change values inside assert when it shouldn't.
536-
content_fail='(%s__ALWAYS_FAIL__(%s, %s))' % (
537-
('' if is_equal else '!'),
538-
var,
539-
', '.join(var_rest),
540-
),
541-
))
503+
if use_brackets:
504+
test_equal = r'\(' + test_equal + r'\)'
505+
test_not_equal = r'\(' + test_not_equal + r'\)'
506+
507+
for is_equal in (True, False):
508+
for n in reversed(range(2, 64)):
509+
if is_equal:
510+
re_str = r'\(' + r'\s+\|\|\s+'.join([test_equal] * n) + r'\)'
511+
else:
512+
re_str = r'\(' + r'\s+\&\&\s+'.join([test_not_equal] * n) + r'\)'
513+
514+
for match in re.finditer(re_str, data):
515+
if _source == '/src/blender/source/blender/editors/mesh/editmesh_extrude_spin.c':
516+
print(match.groups())
517+
var = match.group(1)
518+
var_rest = []
519+
groups = match.groups()
520+
groups_paired = [(groups[i * 2], groups[i * 2 + 1]) for i in range(len(groups) // 2)]
521+
found = True
522+
for a, b in groups_paired:
523+
# Unlikely but possible the checks are swapped.
524+
if b == var and a != var:
525+
a, b = b, a
526+
527+
if a != var:
528+
found = False
529+
break
530+
var_rest.append(b)
531+
532+
if found:
533+
edits.append(Edit(
534+
span=match.span(),
535+
content='(%sSTR_ELEM(%s, %s))' % (
536+
('' if is_equal else '!'),
537+
var,
538+
', '.join(var_rest),
539+
),
540+
# Use same expression otherwise this can change values
541+
# inside assert when it shouldn't.
542+
content_fail='(%s__ALWAYS_FAIL__(%s, %s))' % (
543+
('' if is_equal else '!'),
544+
var,
545+
', '.join(var_rest),
546+
),
547+
))
542548

543549
return edits
544550

0 commit comments

Comments
 (0)