mirror of
https://github.com/xonsh/xonsh.git
synced 2025-03-04 08:24:40 +01:00
some ast fixes
This commit is contained in:
parent
7bfdd78f79
commit
4011a3eb9e
2 changed files with 29 additions and 6 deletions
29
xonsh/ast.py
29
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue