some ast fixes

This commit is contained in:
Anthony Scopatz 2015-02-11 00:33:40 -06:00
parent 7bfdd78f79
commit 4011a3eb9e
2 changed files with 29 additions and 6 deletions

View file

@ -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

View file

@ -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