Kaydet (Commit) 2a188396 authored tarafından Patrick Maupin's avatar Patrick Maupin

Replace enclose decorator with Delimit context manager

Manually cherry-picked from pretty-print branch to introduce in logical order.
üst 8a05486f
...@@ -48,14 +48,23 @@ def to_source(node, indent_with=' ' * 4, add_line_information=False): ...@@ -48,14 +48,23 @@ def to_source(node, indent_with=' ' * 4, add_line_information=False):
return ''.join(str(s) for s in generator.result) return ''.join(str(s) for s in generator.result)
def enclose(enclosure): class Delimit(object):
def decorator(func): """A context manager that can add enclosing
def newfunc(self, node): delimiters around the output of a
self.write(enclosure[0]) SourceGenerator method.
func(self, node) """
self.write(enclosure[-1])
return newfunc def __init__(self, tree, delimiters='()'):
return decorator opening, closing = delimiters
tree.write(opening)
self.closing = delimiters[1]
self.result = tree.result
def __enter__(self):
return self
def __exit__(self, *exc_info):
self.result.append(self.closing)
class SourceGenerator(ExplicitNodeVisitor): class SourceGenerator(ExplicitNodeVisitor):
...@@ -74,6 +83,9 @@ class SourceGenerator(ExplicitNodeVisitor): ...@@ -74,6 +83,9 @@ class SourceGenerator(ExplicitNodeVisitor):
self.indentation = 0 self.indentation = 0
self.new_lines = 0 self.new_lines = 0
def delimit(self, *args):
return Delimit(self, *args)
def write(self, *params): def write(self, *params):
for item in params: for item in params:
if isinstance(item, ast.AST): if isinstance(item, ast.AST):
...@@ -402,43 +414,43 @@ class SourceGenerator(ExplicitNodeVisitor): ...@@ -402,43 +414,43 @@ class SourceGenerator(ExplicitNodeVisitor):
s = '(%s)' % s s = '(%s)' % s
self.write(s) self.write(s)
@enclose('()')
def visit_Tuple(self, node): def visit_Tuple(self, node):
with self.delimit():
self.comma_list(node.elts, len(node.elts) == 1) self.comma_list(node.elts, len(node.elts) == 1)
@enclose('[]')
def visit_List(self, node): def visit_List(self, node):
with self.delimit('[]'):
self.comma_list(node.elts) self.comma_list(node.elts)
@enclose('{}')
def visit_Set(self, node): def visit_Set(self, node):
with self.delimit('{}'):
self.comma_list(node.elts) self.comma_list(node.elts)
@enclose('{}')
def visit_Dict(self, node): def visit_Dict(self, node):
with self.delimit('{}'):
for idx, (key, value) in enumerate(zip(node.keys, node.values)): for idx, (key, value) in enumerate(zip(node.keys, node.values)):
self.write(', ' if idx else '', self.write(', ' if idx else '',
key if key else '', key if key else '',
': ' if key else '**', value) ': ' if key else '**', value)
@enclose('()')
def visit_BinOp(self, node): def visit_BinOp(self, node):
with self.delimit():
self.write(node.left, get_op_symbol(node.op, ' %s '), node.right) self.write(node.left, get_op_symbol(node.op, ' %s '), node.right)
@enclose('()')
def visit_BoolOp(self, node): def visit_BoolOp(self, node):
with self.delimit():
op = get_op_symbol(node.op, ' %s ') op = get_op_symbol(node.op, ' %s ')
for idx, value in enumerate(node.values): for idx, value in enumerate(node.values):
self.write(idx and op or '', value) self.write(idx and op or '', value)
@enclose('()')
def visit_Compare(self, node): def visit_Compare(self, node):
with self.delimit():
self.visit(node.left) self.visit(node.left)
for op, right in zip(node.ops, node.comparators): for op, right in zip(node.ops, node.comparators):
self.write(get_op_symbol(op, ' %s '), right) self.write(get_op_symbol(op, ' %s '), right)
@enclose('()')
def visit_UnaryOp(self, node): def visit_UnaryOp(self, node):
with self.delimit():
self.write(get_op_symbol(node.op), '(', node.operand, ')') self.write(get_op_symbol(node.op), '(', node.operand, ')')
def visit_Subscript(self, node): def visit_Subscript(self, node):
...@@ -460,23 +472,21 @@ class SourceGenerator(ExplicitNodeVisitor): ...@@ -460,23 +472,21 @@ class SourceGenerator(ExplicitNodeVisitor):
def visit_ExtSlice(self, node): def visit_ExtSlice(self, node):
self.comma_list(node.dims, len(node.dims) == 1) self.comma_list(node.dims, len(node.dims) == 1)
@enclose('()') def visit_Yield(self, node, suffix=''):
def visit_Yield(self, node): with self.delimit():
self.write('yield') self.write('yield%s' % suffix)
self.conditional_write(' ', node.value) self.conditional_write(' ', node.value)
# new for Python 3.3 # new for Python 3.3
@enclose('()')
def visit_YieldFrom(self, node): def visit_YieldFrom(self, node):
self.write('yield from') self.visit_Yield(node, ' from')
self.conditional_write(' ', node.value)
# new for Python 3.5 # new for Python 3.5
def visit_Await(self, node): def visit_Await(self, node):
self.write('await ', node.value) self.write('await ', node.value)
@enclose('()')
def visit_Lambda(self, node): def visit_Lambda(self, node):
with self.delimit():
self.write('lambda ') self.write('lambda ')
self.visit_arguments(node.args) self.visit_arguments(node.args)
self.write(': ', node.body) self.write(': ', node.body)
...@@ -484,32 +494,32 @@ class SourceGenerator(ExplicitNodeVisitor): ...@@ -484,32 +494,32 @@ class SourceGenerator(ExplicitNodeVisitor):
def visit_Ellipsis(self, node): def visit_Ellipsis(self, node):
self.write('...') self.write('...')
@enclose('[]')
def visit_ListComp(self, node): def visit_ListComp(self, node):
with self.delimit('[]'):
self.write(node.elt, *node.generators) self.write(node.elt, *node.generators)
@enclose('()')
def visit_GeneratorExp(self, node): def visit_GeneratorExp(self, node):
with self.delimit():
self.write(node.elt, *node.generators) self.write(node.elt, *node.generators)
@enclose('{}')
def visit_SetComp(self, node): def visit_SetComp(self, node):
with self.delimit('{}'):
self.write(node.elt, *node.generators) self.write(node.elt, *node.generators)
@enclose('{}')
def visit_DictComp(self, node): def visit_DictComp(self, node):
with self.delimit('{}'):
self.write(node.key, ': ', node.value, *node.generators) self.write(node.key, ': ', node.value, *node.generators)
@enclose('()')
def visit_IfExp(self, node): def visit_IfExp(self, node):
with self.delimit('()'):
self.write(node.body, ' if ', node.test, ' else ', node.orelse) self.write(node.body, ' if ', node.test, ' else ', node.orelse)
def visit_Starred(self, node): def visit_Starred(self, node):
self.write('*', node.value) self.write('*', node.value)
@enclose('``')
def visit_Repr(self, node): def visit_Repr(self, node):
# XXX: python 2.6 only # XXX: python 2.6 only
with self.delimit('``'):
self.visit(node.value) self.visit(node.value)
def visit_Module(self, node): def visit_Module(self, node):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment