@@ -217,20 +217,26 @@ def _visit_call_helper_go(self, node):
217217 return 'go %s' % self .visit (node .args [0 ])
218218 elif name == '__gomake__' :
219219 return 'make(%s)' % self .visit (node .args [0 ])
220+ elif name == '__go_make_chan__' :
221+ return 'make(chan %s)' % self .visit (node .args [0 ])
220222 else :
221- return SyntaxError ('invalid special go call' )
223+ raise SyntaxError ('invalid special go call' )
222224
223225 def _visit_function (self , node ):
224226 if self ._function_stack [0 ] is node :
225227 self ._vars = set ()
226228
227229 args_typedefs = {}
230+ chan_args_typedefs = {}
228231 return_type = None
229232 for decor in node .decorator_list :
230233 if isinstance (decor , ast .Call ) and isinstance (decor .func , ast .Name ) and decor .func .id == '__typedef__' :
231234 for key in decor .keywords :
232235 #args_typedefs[ key.arg ] = key.value.id
233236 args_typedefs [ key .arg ] = self .visit (key .value )
237+ elif isinstance (decor , ast .Call ) and isinstance (decor .func , ast .Name ) and decor .func .id == '__typedef_chan__' :
238+ for key in decor .keywords :
239+ chan_args_typedefs [ key .arg ] = self .visit (key .value )
234240 elif isinstance (decor , ast .Call ) and isinstance (decor .func , ast .Name ) and decor .func .id == 'returns' :
235241 if decor .keywords :
236242 raise SyntaxError ('invalid go return type' )
@@ -248,7 +254,7 @@ def _visit_function(self, node):
248254 for i , arg in enumerate (node .args .args ):
249255 arg_name = arg .id
250256
251- if arg_name not in args_typedefs :
257+ if arg_name not in args_typedefs . keys () + chan_args_typedefs . keys () :
252258 if arg_name == 'self' :
253259 assert i == 0
254260 is_method = True
@@ -258,8 +264,13 @@ def _visit_function(self, node):
258264 err += '\n missing typedef: %s' % arg .id
259265 raise SyntaxError (err )
260266
261- arg_type = args_typedefs [arg_name ]
262- a = '%s %s' % (arg_name , arg_type )
267+ if arg_name in args_typedefs :
268+ arg_type = args_typedefs [arg_name ]
269+ a = '%s %s' % (arg_name , arg_type )
270+ else :
271+ arg_type = chan_args_typedefs [arg_name ]
272+ a = '%s chan %s' % (arg_name , arg_type )
273+
263274 dindex = i - offset
264275
265276 if a .startswith ('__variable_args__' ): ## TODO support go `...` varargs
@@ -347,7 +358,7 @@ def visit_Assign(self, node):
347358 elif isinstance (node .value , ast .BinOp ) and self .visit (node .value .op )== '<<' and isinstance (node .value .left , ast .Name ) and node .value .left .id == '__go__send__' :
348359 target = self .visit (target )
349360 value = self .visit (node .value .right )
350- return 'var %s <- %s;' % (target , value )
361+ return '%s <- %s;' % (target , value )
351362
352363 elif not self ._function_stack :
353364 target = self .visit (target )
0 commit comments