From 4011a3eb9ef22fe4361c413bfe38b6333a40366a Mon Sep 17 00:00:00 2001 From: Anthony Scopatz Date: Wed, 11 Feb 2015 00:33:40 -0600 Subject: [PATCH] some ast fixes --- xonsh/ast.py | 29 ++++++++++++++++++++++++----- xonsh/execer.py | 6 +++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/xonsh/ast.py b/xonsh/ast.py index c0392a59f..9747a639c 100644 --- a/xonsh/ast.py +++ b/xonsh/ast.py @@ -34,7 +34,7 @@ class CtxAwareTransformer(NodeTransformer): a subprocess. """ - def __init__(self, pasrer): + def __init__(self, parser): """Parameters ---------- parser : xonsh.Parser @@ -74,6 +74,12 @@ class CtxAwareTransformer(NodeTransformer): def ctxadd(value): self.contexts[-1].add(value) + def ctxremove(value): + for ctx in self.contexts[::-1]: + if value in ctx: + ctx.remove(value) + break + def visit_Expr(self, node): lname = leftmostname(node) inscope = False @@ -127,16 +133,29 @@ class CtxAwareTransformer(NodeTransformer): self.ctxupdate(map(leftmostname, targ.elts)) else: self.ctxadd(leftmostname(targ)) + self.generic_visit(node) return node def visit_FunctionDef(self, node): - assert False + self.ctxadd(node.name) + self.generic_visit(node) + return node def visit_ClassDef(self, node): - assert False + self.ctxadd(node.name) + self.generic_visit(node) + return node def visit_Delete(self, node): - assert False + for targ in node.targets: + if isinstance(targ, Name): + self.ctxremove(targ.id) + self.generic_visit(node) + return node def visit_Try(self, node): - assert False + for handler in node.handlers: + if handler.name is not None: + self.ctxadd(handler.name) + self.generic_visit(node) + return node diff --git a/xonsh/execer.py b/xonsh/execer.py index 3c0256127..e858e8da2 100644 --- a/xonsh/execer.py +++ b/xonsh/execer.py @@ -26,12 +26,16 @@ class Execer(object): self.parser = Parser(**parser_args) self.filename = filename self.debug_level = debug_level - self.ctxtransformer = ast.CtxAwareTransformer(parser) + self.ctxtransformer = ast.CtxAwareTransformer(self.parser) def parse(self, input, ctx): """Parses xonsh code in a context-aware fashion. For context-free parsing, please use the Parser class directly. """ + if ctx is None: + ctx = set() + elif isinstance(ctx, Mapping): + ctx = set(ctx.keys()) # Parsing actually happens in a couple of phases. The first is a # shortcut for a context-free parser. Nomrally, all subprocess # lines should be wrapped in $(), to indicate that they are a