diff options
author | Marion <marion.zepf@gmail.com> | 2013-08-31 13:26:43 (GMT) |
---|---|---|
committer | Marion <marion.zepf@gmail.com> | 2013-08-31 13:26:43 (GMT) |
commit | 26fc518a22e7eda9a385070e538a5892d898eea0 (patch) | |
tree | 4920a6a1182c5be72a5f512cc64ad5d85153152b /TurtleArt/taexportpython.py | |
parent | b79ee751f99c6a132441fb18d09693498d0bc8f6 (diff) |
fix python export tool again
Diffstat (limited to 'TurtleArt/taexportpython.py')
-rw-r--r-- | TurtleArt/taexportpython.py | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/TurtleArt/taexportpython.py b/TurtleArt/taexportpython.py index cde39e9..71c4f9b 100644 --- a/TurtleArt/taexportpython.py +++ b/TurtleArt/taexportpython.py @@ -126,18 +126,26 @@ def _action_stack_to_python(block, lc, name="start"): _ACTION_STACK_END % (name, name_id)] return "".join(snippets) -def _walk_action_stack(top_block, lc): - """ Turn a stack of blocks into a list of ASTs """ +def _walk_action_stack(top_block, lc, convert_me=True): + """ Turn a stack of blocks into a list of ASTs + convert_me -- convert values and Primitives to ASTs or return them + unconverted? """ block = top_block # value blocks don't have a primitive if block.is_value_block(): raw_value = block.get_value(add_type_prefix=False) - value_ast = value_to_ast(raw_value) - if value_ast is not None: - return [value_ast] + if convert_me: + value_ast = value_to_ast(raw_value) + if value_ast is not None: + return [value_ast] + else: + return [] else: - return [] + if raw_value is not None: + return [raw_value] + else: + return [] def _get_prim(block): prim = lc.get_prim_callable(block.primitive) @@ -156,20 +164,23 @@ def _walk_action_stack(top_block, lc): PyExportError on failure. """ if prim is None: prim = _get_prim(block) - if prim.export_me: - try: - new_ast = prim.get_ast(*arg_asts) - except ValueError: - traceback.print_exc() - raise PyExportError(_("error while exporting block"), - block=block) - if isinstance(new_ast, (list, tuple)): - ast_list.extend(new_ast) - elif new_ast is not None: + if convert_me: + if prim.export_me: + try: + new_ast = prim.get_ast(*arg_asts) + except ValueError: + traceback.print_exc() + raise PyExportError(_("error while exporting block"), + block=block) + if isinstance(new_ast, (list, tuple)): + ast_list.extend(new_ast) + elif new_ast is not None: + ast_list.append(new_ast) + elif arg_asts: # TODO do we ever get here? + new_ast = ast.List(elts=arg_asts, ctx=ast.Load) ast_list.append(new_ast) - elif arg_asts: - new_ast = ast.List(elts=arg_asts, ctx=ast.Load) - ast_list.append(new_ast) + else: + ast_list.append((prim, ) + tuple(arg_asts)) # skip the very first dock/ connection - it's either the previous block or # the return value of this block @@ -194,17 +205,15 @@ def _walk_action_stack(top_block, lc): # argument block if dock[0] == 'flow': # body of conditional or loop - new_arg_asts = _walk_action_stack(conn, lc) + new_arg_asts = _walk_action_stack(conn, lc, + convert_me=convert_me) if prim == LogoCode.prim_loop: new_arg_asts.append(_ast_yield_true()) arg_asts.append(new_arg_asts) else: # argument block - if conn.is_value_block(): - new_arg_asts = _walk_action_stack(conn, lc) - arg_asts.append(*new_arg_asts) - else: - arg_asts.append(_get_prim(conn)) + new_arg_asts = _walk_action_stack(conn, lc, convert_me=False) + arg_asts.append(*new_arg_asts) # finish off last block _finish_off(block, prim) |