Skip to content

Commit 768b8c8

Browse files
author
hartsantler
committed
go backend: automatically translate a new assignment to :=
1 parent 1c0b9e4 commit 768b8c8

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

pythonjs/pythonjs_to_go.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ def __init__(self, requirejs=False, insert_runtime=False):
1414
pythonjs.JSGenerator.__init__(self, requirejs=False, insert_runtime=False)
1515
#self._classes = dict()
1616
#self._class_props = dict()
17+
self._vars = set()
1718

1819
def visit_Print(self, node):
1920
r = [ 'fmt.Println(%s);' %self.visit(e) for e in node.values]
@@ -113,7 +114,10 @@ def _visit_call_helper_go(self, node):
113114
else:
114115
return SyntaxError('invalid special go call')
115116

116-
def visit_FunctionDef(self, node):
117+
def _visit_function(self, node):
118+
if self._function_stack[0] is node:
119+
self._vars = set()
120+
117121
args_typedefs = {}
118122
return_type = None
119123
for decor in node.decorator_list:
@@ -183,9 +187,13 @@ def _visit_call_helper_var(self, node):
183187
for key in node.keywords:
184188
args.append( key.arg )
185189

186-
out = []
187-
for v in args:
188-
out.append( self.indent() + 'var ' + v + ' int')
190+
for name in args:
191+
if name not in self._vars:
192+
self._vars.add( name )
193+
194+
#out = []
195+
#for v in args:
196+
# out.append( self.indent() + 'var ' + v + ' int')
189197

190198
#return '\n'.join(out)
191199
return ''
@@ -200,11 +208,21 @@ def visit_Assign(self, node):
200208
value = self.visit(node.value.right)
201209
return 'var %s <- %s;' % (target, value)
202210

211+
elif not self._function_stack:
212+
target = self.visit(target)
213+
value = self.visit(node.value)
214+
return 'var %s = %s;' % (target, value)
215+
216+
elif isinstance(node.targets[0], ast.Name) and target.id in self._vars:
217+
target = self.visit(target)
218+
value = self.visit(node.value)
219+
self._vars.remove( target )
220+
return '%s := %s;' % (target, value)
221+
203222
else:
204223
target = self.visit(target)
205224
value = self.visit(node.value)
206-
code = 'var %s = %s;' % (target, value)
207-
return code
225+
return '%s = %s;' % (target, value)
208226

209227
def visit_While(self, node):
210228
body = [ 'for %s {' %self.visit(node.test)]

regtests/go/vars.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
"""var assignment :=, and reassignment ="""
2+
3+
def main():
4+
a = 1
5+
a = 2
6+
TestError( a==2 )

0 commit comments

Comments
 (0)