Make format string linter understand basic template parameter syntax
This commit is contained in:
parent
f66e1c793e
commit
4441ad677a
1 changed files with 37 additions and 1 deletions
|
@ -123,6 +123,32 @@ def parse_function_call_and_arguments(function_name, function_call):
|
||||||
['foo(', '123', ')']
|
['foo(', '123', ')']
|
||||||
>>> parse_function_call_and_arguments("foo", 'foo("foo")')
|
>>> parse_function_call_and_arguments("foo", 'foo("foo")')
|
||||||
['foo(', '"foo"', ')']
|
['foo(', '"foo"', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t>().to_bytes(buf), err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t>().to_bytes(buf),', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo<wchar_t>().to_bytes(buf), err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo<wchar_t>().to_bytes(buf),', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo().to_bytes(buf), err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo().to_bytes(buf),', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo << 1, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo << 1,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo<bar>() >> 1, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo<bar>() >> 1,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo < 1 ? bar : foobar, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo < 1 ? bar : foobar,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo < 1, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo < 1,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo > 1 ? bar : foobar, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo > 1 ? bar : foobar,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo > 1, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo > 1,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo <= 1, err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo <= 1,', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo <= bar<1, 2>(1, 2), err);')
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo <= bar<1, 2>(1, 2),', ' err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo>foo<1,2>(1,2)?bar:foobar,err)');
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo>foo<1,2>(1,2)?bar:foobar,', 'err', ')']
|
||||||
|
>>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo>foo<1,2>(1,2),err)');
|
||||||
|
['strprintf(', '"%s (%d)",', ' foo>foo<1,2>(1,2),', 'err', ')']
|
||||||
"""
|
"""
|
||||||
assert(type(function_name) is str and type(function_call) is str and function_name)
|
assert(type(function_name) is str and type(function_call) is str and function_name)
|
||||||
remaining = normalize(escape(function_call))
|
remaining = normalize(escape(function_call))
|
||||||
|
@ -131,9 +157,10 @@ def parse_function_call_and_arguments(function_name, function_call):
|
||||||
parts = [expected_function_call]
|
parts = [expected_function_call]
|
||||||
remaining = remaining[len(expected_function_call):]
|
remaining = remaining[len(expected_function_call):]
|
||||||
open_parentheses = 1
|
open_parentheses = 1
|
||||||
|
open_template_arguments = 0
|
||||||
in_string = False
|
in_string = False
|
||||||
parts.append("")
|
parts.append("")
|
||||||
for char in remaining:
|
for i, char in enumerate(remaining):
|
||||||
parts.append(parts.pop() + char)
|
parts.append(parts.pop() + char)
|
||||||
if char == "\"":
|
if char == "\"":
|
||||||
in_string = not in_string
|
in_string = not in_string
|
||||||
|
@ -151,6 +178,15 @@ def parse_function_call_and_arguments(function_name, function_call):
|
||||||
parts.append(parts.pop()[:-1])
|
parts.append(parts.pop()[:-1])
|
||||||
parts.append(char)
|
parts.append(char)
|
||||||
break
|
break
|
||||||
|
prev_char = remaining[i - 1] if i - 1 >= 0 else None
|
||||||
|
next_char = remaining[i + 1] if i + 1 <= len(remaining) - 1 else None
|
||||||
|
if char == "<" and next_char not in [" ", "<", "="] and prev_char not in [" ", "<"]:
|
||||||
|
open_template_arguments += 1
|
||||||
|
continue
|
||||||
|
if char == ">" and next_char not in [" ", ">", "="] and prev_char not in [" ", ">"] and open_template_arguments > 0:
|
||||||
|
open_template_arguments -= 1
|
||||||
|
if open_template_arguments > 0:
|
||||||
|
continue
|
||||||
if char == ",":
|
if char == ",":
|
||||||
parts.append("")
|
parts.append("")
|
||||||
return parts
|
return parts
|
||||||
|
|
Loading…
Reference in a new issue