@@ -123,6 +123,32 @@ def parse_function_call_and_arguments(function_name, function_call):
123
123
['foo(', '123', ')']
124
124
>>> parse_function_call_and_arguments("foo", 'foo("foo")')
125
125
['foo(', '"foo"', ')']
126
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t>().to_bytes(buf), err);')
127
+ ['strprintf(', '"%s (%d)",', ' std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>,wchar_t>().to_bytes(buf),', ' err', ')']
128
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo<wchar_t>().to_bytes(buf), err);')
129
+ ['strprintf(', '"%s (%d)",', ' foo<wchar_t>().to_bytes(buf),', ' err', ')']
130
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo().to_bytes(buf), err);')
131
+ ['strprintf(', '"%s (%d)",', ' foo().to_bytes(buf),', ' err', ')']
132
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo << 1, err);')
133
+ ['strprintf(', '"%s (%d)",', ' foo << 1,', ' err', ')']
134
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo<bar>() >> 1, err);')
135
+ ['strprintf(', '"%s (%d)",', ' foo<bar>() >> 1,', ' err', ')']
136
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo < 1 ? bar : foobar, err);')
137
+ ['strprintf(', '"%s (%d)",', ' foo < 1 ? bar : foobar,', ' err', ')']
138
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo < 1, err);')
139
+ ['strprintf(', '"%s (%d)",', ' foo < 1,', ' err', ')']
140
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo > 1 ? bar : foobar, err);')
141
+ ['strprintf(', '"%s (%d)",', ' foo > 1 ? bar : foobar,', ' err', ')']
142
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo > 1, err);')
143
+ ['strprintf(', '"%s (%d)",', ' foo > 1,', ' err', ')']
144
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo <= 1, err);')
145
+ ['strprintf(', '"%s (%d)",', ' foo <= 1,', ' err', ')']
146
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo <= bar<1, 2>(1, 2), err);')
147
+ ['strprintf(', '"%s (%d)",', ' foo <= bar<1, 2>(1, 2),', ' err', ')']
148
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo>foo<1,2>(1,2)?bar:foobar,err)');
149
+ ['strprintf(', '"%s (%d)",', ' foo>foo<1,2>(1,2)?bar:foobar,', 'err', ')']
150
+ >>> parse_function_call_and_arguments("strprintf", 'strprintf("%s (%d)", foo>foo<1,2>(1,2),err)');
151
+ ['strprintf(', '"%s (%d)",', ' foo>foo<1,2>(1,2),', 'err', ')']
126
152
"""
127
153
assert (type (function_name ) is str and type (function_call ) is str and function_name )
128
154
remaining = normalize (escape (function_call ))
@@ -131,9 +157,10 @@ def parse_function_call_and_arguments(function_name, function_call):
131
157
parts = [expected_function_call ]
132
158
remaining = remaining [len (expected_function_call ):]
133
159
open_parentheses = 1
160
+ open_template_arguments = 0
134
161
in_string = False
135
162
parts .append ("" )
136
- for char in remaining :
163
+ for i , char in enumerate ( remaining ) :
137
164
parts .append (parts .pop () + char )
138
165
if char == "\" " :
139
166
in_string = not in_string
@@ -151,6 +178,15 @@ def parse_function_call_and_arguments(function_name, function_call):
151
178
parts .append (parts .pop ()[:- 1 ])
152
179
parts .append (char )
153
180
break
181
+ prev_char = remaining [i - 1 ] if i - 1 >= 0 else None
182
+ next_char = remaining [i + 1 ] if i + 1 <= len (remaining ) - 1 else None
183
+ if char == "<" and next_char not in [" " , "<" , "=" ] and prev_char not in [" " , "<" ]:
184
+ open_template_arguments += 1
185
+ continue
186
+ if char == ">" and next_char not in [" " , ">" , "=" ] and prev_char not in [" " , ">" ] and open_template_arguments > 0 :
187
+ open_template_arguments -= 1
188
+ if open_template_arguments > 0 :
189
+ continue
154
190
if char == "," :
155
191
parts .append ("" )
156
192
return parts
0 commit comments