@@ -249,6 +249,8 @@ def resolve_name(self, writer, name):
249249 if var :
250250 if var .type == Var .TYPE_GLOBAL :
251251 return self ._resolve_global (writer , name )
252+ if var .type == Var .TYPE_TUPLE_PARAM :
253+ return expr .GeneratedLocalVar (name )
252254 writer .write_checked_call1 ('πg.CheckLocal(πF, {}, {})' ,
253255 util .adjust_local_name (name ),
254256 util .go_str (name ))
@@ -263,6 +265,7 @@ class Var(object):
263265 TYPE_LOCAL = 0
264266 TYPE_PARAM = 1
265267 TYPE_GLOBAL = 2
268+ TYPE_TUPLE_PARAM = 3
266269
267270 def __init__ (self , name , var_type , arg_index = None ):
268271 self .name = name
@@ -273,6 +276,9 @@ def __init__(self, name, var_type, arg_index=None):
273276 elif var_type == Var .TYPE_PARAM :
274277 assert arg_index is not None
275278 self .init_expr = 'πArgs[{}]' .format (arg_index )
279+ elif var_type == Var .TYPE_TUPLE_PARAM :
280+ assert arg_index is None
281+ self .init_expr = 'nil'
276282 else :
277283 assert arg_index is None
278284 self .init_expr = None
@@ -364,16 +370,40 @@ def __init__(self, node):
364370 BlockVisitor .__init__ (self )
365371 self .is_generator = False
366372 node_args = node .args
367- args = [a .arg for a in node_args .args ]
373+ args = []
374+ for arg in node_args .args :
375+ if isinstance (arg , ast .Tuple ):
376+ args .append (arg .elts )
377+ else :
378+ args .append (arg .arg )
379+ # args = [a.arg for a in node_args.args]
380+
368381 if node_args .vararg :
369382 args .append (node_args .vararg .arg )
370383 if node_args .kwarg :
371384 args .append (node_args .kwarg .arg )
372385 for i , name in enumerate (args ):
373- if name in self .vars :
374- msg = "duplicate argument '{}' in function definition" .format (name )
375- raise util .ParseError (node , msg )
376- self .vars [name ] = Var (name , Var .TYPE_PARAM , arg_index = i )
386+ if isinstance (name , list ):
387+ arg_name = 'τ{}' .format (id (name ))
388+ for el in name :
389+ self ._parse_tuple (el , node )
390+ self .vars [arg_name ] = Var (arg_name , Var .TYPE_PARAM , i )
391+ else :
392+ self ._check_duplicate_args (name , node )
393+ self .vars [name ] = Var (name , Var .TYPE_PARAM , arg_index = i )
394+
395+ def _parse_tuple (self , el , node ):
396+ if isinstance (el , ast .Tuple ):
397+ for x in el .elts :
398+ self ._parse_tuple (x , node )
399+ else :
400+ self ._check_duplicate_args (el .arg , node )
401+ self .vars [el .arg ] = Var (el .arg , Var .TYPE_TUPLE_PARAM )
402+
403+ def _check_duplicate_args (self , name , node ):
404+ if name in self .vars :
405+ msg = "duplicate argument '{}' in function definition" .format (name )
406+ raise util .ParseError (node , msg )
377407
378408 def visit_Yield (self , unused_node ): # pylint: disable=unused-argument
379409 self .is_generator = True
0 commit comments