| Index: third_party/logilab/astng/as_string.py
 | 
| diff --git a/third_party/logilab/astroid/as_string.py b/third_party/logilab/astng/as_string.py
 | 
| similarity index 54%
 | 
| rename from third_party/logilab/astroid/as_string.py
 | 
| rename to third_party/logilab/astng/as_string.py
 | 
| index f19713d9f1722e8470443e2b86e945cfd2aad5e0..0a42668d2ce4aa307bde1e8a59864c5f916db475 100644
 | 
| --- a/third_party/logilab/astroid/as_string.py
 | 
| +++ b/third_party/logilab/astng/as_string.py
 | 
| @@ -1,77 +1,45 @@
 | 
| -# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 | 
| +# copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
 | 
|  # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
 | 
| +# copyright 2003-2010 Sylvain Thenault, all rights reserved.
 | 
| +# contact mailto:thenault@gmail.com
 | 
|  #
 | 
| -# This file is part of astroid.
 | 
| +# This file is part of logilab-astng.
 | 
|  #
 | 
| -# astroid is free software: you can redistribute it and/or modify it
 | 
| +# logilab-astng is free software: you can redistribute it and/or modify it
 | 
|  # under the terms of the GNU Lesser General Public License as published by the
 | 
|  # Free Software Foundation, either version 2.1 of the License, or (at your
 | 
|  # option) any later version.
 | 
|  #
 | 
| -# astroid is distributed in the hope that it will be useful, but
 | 
| +# logilab-astng is distributed in the hope that it will be useful, but
 | 
|  # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
|  # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
 | 
|  # for more details.
 | 
|  #
 | 
|  # You should have received a copy of the GNU Lesser General Public License along
 | 
| -# with astroid. If not, see <http://www.gnu.org/licenses/>.
 | 
| -"""This module renders Astroid nodes as string:
 | 
| +# with logilab-astng. If not, see <http://www.gnu.org/licenses/>.
 | 
| +"""This module renders ASTNG nodes to string representation.
 | 
|  
 | 
| -* :func:`to_code` function return equivalent (hopefuly valid) python string
 | 
| -
 | 
| -* :func:`dump` function return an internal representation of nodes found
 | 
| -  in the tree, useful for debugging or understanding the tree structure
 | 
| +It will probably not work on bare _ast trees.
 | 
|  """
 | 
| -
 | 
|  import sys
 | 
|  
 | 
| +
 | 
|  INDENT = '    ' # 4 spaces ; keep indentation variable
 | 
|  
 | 
|  
 | 
| -def dump(node, ids=False):
 | 
| -    """print a nice astroid tree representation.
 | 
| -
 | 
| -    :param ids: if true, we also print the ids (usefull for debugging)
 | 
| -    """
 | 
| -    result = []
 | 
| -    _repr_tree(node, result, ids=ids)
 | 
| -    return "\n".join(result)
 | 
| -
 | 
| -def _repr_tree(node, result, indent='', _done=None, ids=False):
 | 
| -    """built a tree representation of a node as a list of lines"""
 | 
| -    if _done is None:
 | 
| -        _done = set()
 | 
| -    if not hasattr(node, '_astroid_fields'): # not a astroid node
 | 
| -        return
 | 
| -    if node in _done:
 | 
| -        result.append(indent + 'loop in tree: %s' % node)
 | 
| -        return
 | 
| -    _done.add(node)
 | 
| -    node_str = str(node)
 | 
| -    if ids:
 | 
| -        node_str += '  . \t%x' % id(node)
 | 
| -    result.append(indent + node_str)
 | 
| -    indent += INDENT
 | 
| -    for field in node._astroid_fields:
 | 
| -        value = getattr(node, field)
 | 
| -        if isinstance(value, (list, tuple)):
 | 
| -            result.append(indent + field + " = [")
 | 
| -            for child in value:
 | 
| -                if isinstance(child, (list, tuple)):
 | 
| -                    # special case for Dict # FIXME
 | 
| -                    _repr_tree(child[0], result, indent, _done, ids)
 | 
| -                    _repr_tree(child[1], result, indent, _done, ids)
 | 
| -                    result.append(indent + ',')
 | 
| -                else:
 | 
| -                    _repr_tree(child, result, indent, _done, ids)
 | 
| -            result.append(indent + "]")
 | 
| +def _import_string(names):
 | 
| +    """return a list of (name, asname) formatted as a string"""
 | 
| +    _names = []
 | 
| +    for name, asname in names:
 | 
| +        if asname is not None:
 | 
| +            _names.append('%s as %s' % (name, asname))
 | 
|          else:
 | 
| -            result.append(indent + field + " = ")
 | 
| -            _repr_tree(value, result, indent, _done, ids)
 | 
| +            _names.append(name)
 | 
| +    return  ', '.join(_names)
 | 
|  
 | 
|  
 | 
|  class AsStringVisitor(object):
 | 
| -    """Visitor to render an Astroid node as a valid python code string"""
 | 
| +    """Visitor to render an ASTNG node as string """
 | 
|  
 | 
|      def __call__(self, node):
 | 
|          """Makes this visitor behave as a simple function"""
 | 
| @@ -86,129 +54,118 @@ class AsStringVisitor(object):
 | 
|      ## visit_<node> methods ###########################################
 | 
|  
 | 
|      def visit_arguments(self, node):
 | 
| -        """return an astroid.Function node as string"""
 | 
| +        """return an astng.Function node as string"""
 | 
|          return node.format_args()
 | 
|  
 | 
|      def visit_assattr(self, node):
 | 
| -        """return an astroid.AssAttr node as string"""
 | 
| +        """return an astng.AssAttr node as string"""
 | 
|          return self.visit_getattr(node)
 | 
|  
 | 
|      def visit_assert(self, node):
 | 
| -        """return an astroid.Assert node as string"""
 | 
| +        """return an astng.Assert node as string"""
 | 
|          if node.fail:
 | 
|              return 'assert %s, %s' % (node.test.accept(self),
 | 
| -                                      node.fail.accept(self))
 | 
| +                                        node.fail.accept(self))
 | 
|          return 'assert %s' % node.test.accept(self)
 | 
|  
 | 
|      def visit_assname(self, node):
 | 
| -        """return an astroid.AssName node as string"""
 | 
| +        """return an astng.AssName node as string"""
 | 
|          return node.name
 | 
|  
 | 
|      def visit_assign(self, node):
 | 
| -        """return an astroid.Assign node as string"""
 | 
| +        """return an astng.Assign node as string"""
 | 
|          lhs = ' = '.join([n.accept(self) for n in node.targets])
 | 
|          return '%s = %s' % (lhs, node.value.accept(self))
 | 
|  
 | 
|      def visit_augassign(self, node):
 | 
| -        """return an astroid.AugAssign node as string"""
 | 
| +        """return an astng.AugAssign node as string"""
 | 
|          return '%s %s %s' % (node.target.accept(self), node.op, node.value.accept(self))
 | 
|  
 | 
|      def visit_backquote(self, node):
 | 
| -        """return an astroid.Backquote node as string"""
 | 
| +        """return an astng.Backquote node as string"""
 | 
|          return '`%s`' % node.value.accept(self)
 | 
|  
 | 
|      def visit_binop(self, node):
 | 
| -        """return an astroid.BinOp node as string"""
 | 
| +        """return an astng.BinOp node as string"""
 | 
|          return '(%s) %s (%s)' % (node.left.accept(self), node.op, node.right.accept(self))
 | 
|  
 | 
|      def visit_boolop(self, node):
 | 
| -        """return an astroid.BoolOp node as string"""
 | 
| +        """return an astng.BoolOp node as string"""
 | 
|          return (' %s ' % node.op).join(['(%s)' % n.accept(self)
 | 
| -                                        for n in node.values])
 | 
| +                                            for n in node.values])
 | 
|  
 | 
|      def visit_break(self, node):
 | 
| -        """return an astroid.Break node as string"""
 | 
| +        """return an astng.Break node as string"""
 | 
|          return 'break'
 | 
|  
 | 
|      def visit_callfunc(self, node):
 | 
| -        """return an astroid.CallFunc node as string"""
 | 
| +        """return an astng.CallFunc node as string"""
 | 
|          expr_str = node.func.accept(self)
 | 
|          args = [arg.accept(self) for arg in node.args]
 | 
|          if node.starargs:
 | 
| -            args.append('*' + node.starargs.accept(self))
 | 
| +            args.append( '*' + node.starargs.accept(self))
 | 
|          if node.kwargs:
 | 
| -            args.append('**' + node.kwargs.accept(self))
 | 
| +            args.append( '**' + node.kwargs.accept(self))
 | 
|          return '%s(%s)' % (expr_str, ', '.join(args))
 | 
|  
 | 
|      def visit_class(self, node):
 | 
| -        """return an astroid.Class node as string"""
 | 
| +        """return an astng.Class node as string"""
 | 
|          decorate = node.decorators and node.decorators.accept(self)  or ''
 | 
| -        bases = ', '.join([n.accept(self) for n in node.bases])
 | 
| -        if sys.version_info[0] == 2:
 | 
| -            bases = bases and '(%s)' % bases or ''
 | 
| -        else:
 | 
| -            metaclass = node.metaclass()
 | 
| -            if metaclass:
 | 
| -                if bases:
 | 
| -                    bases = '(%s, metaclass=%s)' % (bases, metaclass.name)
 | 
| -                else:
 | 
| -                    bases = '(metaclass=%s)' % metaclass.name
 | 
| -            else:
 | 
| -                bases = bases and '(%s)' % bases or ''
 | 
| +        bases =  ', '.join([n.accept(self) for n in node.bases])
 | 
| +        bases = bases and '(%s)' % bases or ''
 | 
|          docs = node.doc and '\n%s"""%s"""' % (INDENT, node.doc) or ''
 | 
|          return '\n\n%sclass %s%s:%s\n%s\n' % (decorate, node.name, bases, docs,
 | 
| -                                              self._stmt_list(node.body))
 | 
| +                                            self._stmt_list( node.body))
 | 
|  
 | 
|      def visit_compare(self, node):
 | 
| -        """return an astroid.Compare node as string"""
 | 
| +        """return an astng.Compare node as string"""
 | 
|          rhs_str = ' '.join(['%s %s' % (op, expr.accept(self))
 | 
|                              for op, expr in node.ops])
 | 
|          return '%s %s' % (node.left.accept(self), rhs_str)
 | 
|  
 | 
|      def visit_comprehension(self, node):
 | 
| -        """return an astroid.Comprehension node as string"""
 | 
| -        ifs = ''.join([' if %s' % n.accept(self) for n in node.ifs])
 | 
| +        """return an astng.Comprehension node as string"""
 | 
| +        ifs = ''.join([ ' if %s' % n.accept(self) for n in node.ifs])
 | 
|          return 'for %s in %s%s' % (node.target.accept(self),
 | 
| -                                   node.iter.accept(self), ifs)
 | 
| +                                    node.iter.accept(self), ifs )
 | 
|  
 | 
|      def visit_const(self, node):
 | 
| -        """return an astroid.Const node as string"""
 | 
| +        """return an astng.Const node as string"""
 | 
|          return repr(node.value)
 | 
|  
 | 
|      def visit_continue(self, node):
 | 
| -        """return an astroid.Continue node as string"""
 | 
| +        """return an astng.Continue node as string"""
 | 
|          return 'continue'
 | 
|  
 | 
|      def visit_delete(self, node): # XXX check if correct
 | 
| -        """return an astroid.Delete node as string"""
 | 
| +        """return an astng.Delete node as string"""
 | 
|          return 'del %s' % ', '.join([child.accept(self)
 | 
| -                                     for child in node.targets])
 | 
| +                                for child in node.targets])
 | 
|  
 | 
|      def visit_delattr(self, node):
 | 
| -        """return an astroid.DelAttr node as string"""
 | 
| +        """return an astng.DelAttr node as string"""
 | 
|          return self.visit_getattr(node)
 | 
|  
 | 
|      def visit_delname(self, node):
 | 
| -        """return an astroid.DelName node as string"""
 | 
| +        """return an astng.DelName node as string"""
 | 
|          return node.name
 | 
|  
 | 
|      def visit_decorators(self, node):
 | 
| -        """return an astroid.Decorators node as string"""
 | 
| +        """return an astng.Decorators node as string"""
 | 
|          return '@%s\n' % '\n@'.join([item.accept(self) for item in node.nodes])
 | 
|  
 | 
|      def visit_dict(self, node):
 | 
| -        """return an astroid.Dict node as string"""
 | 
| +        """return an astng.Dict node as string"""
 | 
|          return '{%s}' % ', '.join(['%s: %s' % (key.accept(self),
 | 
| -                                               value.accept(self))
 | 
| -                                   for key, value in node.items])
 | 
| +                            value.accept(self)) for key, value in node.items])
 | 
|  
 | 
|      def visit_dictcomp(self, node):
 | 
| -        """return an astroid.DictComp node as string"""
 | 
| +        """return an astng.DictComp node as string"""
 | 
|          return '{%s: %s %s}' % (node.key.accept(self), node.value.accept(self),
 | 
| -                                ' '.join([n.accept(self) for n in node.generators]))
 | 
| +                ' '.join([n.accept(self) for n in node.generators]))
 | 
|  
 | 
|      def visit_discard(self, node):
 | 
| -        """return an astroid.Discard node as string"""
 | 
| +        """return an astng.Discard node as string"""
 | 
|          return node.value.accept(self)
 | 
|  
 | 
|      def visit_emptynode(self, node):
 | 
| @@ -219,7 +176,7 @@ class AsStringVisitor(object):
 | 
|          if node.type:
 | 
|              if node.name:
 | 
|                  excs = 'except %s, %s' % (node.type.accept(self),
 | 
| -                                          node.name.accept(self))
 | 
| +                                        node.name.accept(self))
 | 
|              else:
 | 
|                  excs = 'except %s' % node.type.accept(self)
 | 
|          else:
 | 
| @@ -227,7 +184,7 @@ class AsStringVisitor(object):
 | 
|          return '%s:\n%s' % (excs, self._stmt_list(node.body))
 | 
|  
 | 
|      def visit_ellipsis(self, node):
 | 
| -        """return an astroid.Ellipsis node as string"""
 | 
| +        """return an astng.Ellipsis node as string"""
 | 
|          return '...'
 | 
|  
 | 
|      def visit_empty(self, node):
 | 
| @@ -235,7 +192,7 @@ class AsStringVisitor(object):
 | 
|          return ''
 | 
|  
 | 
|      def visit_exec(self, node):
 | 
| -        """return an astroid.Exec node as string"""
 | 
| +        """return an astng.Exec node as string"""
 | 
|          if node.locals:
 | 
|              return 'exec %s in %s, %s' % (node.expr.accept(self),
 | 
|                                            node.locals.accept(self),
 | 
| @@ -246,93 +203,91 @@ class AsStringVisitor(object):
 | 
|          return 'exec %s' % node.expr.accept(self)
 | 
|  
 | 
|      def visit_extslice(self, node):
 | 
| -        """return an astroid.ExtSlice node as string"""
 | 
| -        return ','.join([dim.accept(self) for dim in node.dims])
 | 
| +        """return an astng.ExtSlice node as string"""
 | 
| +        return ','.join( [dim.accept(self) for dim in node.dims] )
 | 
|  
 | 
|      def visit_for(self, node):
 | 
| -        """return an astroid.For node as string"""
 | 
| +        """return an astng.For node as string"""
 | 
|          fors = 'for %s in %s:\n%s' % (node.target.accept(self),
 | 
| -                                      node.iter.accept(self),
 | 
| -                                      self._stmt_list(node.body))
 | 
| +                                    node.iter.accept(self),
 | 
| +                                    self._stmt_list( node.body))
 | 
|          if node.orelse:
 | 
|              fors = '%s\nelse:\n%s' % (fors, self._stmt_list(node.orelse))
 | 
|          return fors
 | 
|  
 | 
|      def visit_from(self, node):
 | 
| -        """return an astroid.From node as string"""
 | 
| +        """return an astng.From node as string"""
 | 
|          return 'from %s import %s' % ('.' * (node.level or 0) + node.modname,
 | 
|                                        _import_string(node.names))
 | 
|  
 | 
|      def visit_function(self, node):
 | 
| -        """return an astroid.Function node as string"""
 | 
| +        """return an astng.Function node as string"""
 | 
|          decorate = node.decorators and node.decorators.accept(self)  or ''
 | 
|          docs = node.doc and '\n%s"""%s"""' % (INDENT, node.doc) or ''
 | 
|          return '\n%sdef %s(%s):%s\n%s' % (decorate, node.name, node.args.accept(self),
 | 
| -                                          docs, self._stmt_list(node.body))
 | 
| +                                        docs, self._stmt_list(node.body))
 | 
|  
 | 
|      def visit_genexpr(self, node):
 | 
| -        """return an astroid.GenExpr node as string"""
 | 
| -        return '(%s %s)' % (node.elt.accept(self),
 | 
| -                            ' '.join([n.accept(self) for n in node.generators]))
 | 
| +        """return an astng.GenExpr node as string"""
 | 
| +        return '(%s %s)' % (node.elt.accept(self), ' '.join([n.accept(self)
 | 
| +                                                    for n in node.generators]))
 | 
|  
 | 
|      def visit_getattr(self, node):
 | 
| -        """return an astroid.Getattr node as string"""
 | 
| +        """return an astng.Getattr node as string"""
 | 
|          return '%s.%s' % (node.expr.accept(self), node.attrname)
 | 
|  
 | 
|      def visit_global(self, node):
 | 
| -        """return an astroid.Global node as string"""
 | 
| +        """return an astng.Global node as string"""
 | 
|          return 'global %s' % ', '.join(node.names)
 | 
|  
 | 
|      def visit_if(self, node):
 | 
| -        """return an astroid.If node as string"""
 | 
| +        """return an astng.If node as string"""
 | 
|          ifs = ['if %s:\n%s' % (node.test.accept(self), self._stmt_list(node.body))]
 | 
|          if node.orelse:# XXX use elif ???
 | 
|              ifs.append('else:\n%s' % self._stmt_list(node.orelse))
 | 
|          return '\n'.join(ifs)
 | 
|  
 | 
|      def visit_ifexp(self, node):
 | 
| -        """return an astroid.IfExp node as string"""
 | 
| +        """return an astng.IfExp node as string"""
 | 
|          return '%s if %s else %s' % (node.body.accept(self),
 | 
| -                                     node.test.accept(self),
 | 
| -                                     node.orelse.accept(self))
 | 
| +                node.test.accept(self), node.orelse.accept(self))
 | 
|  
 | 
|      def visit_import(self, node):
 | 
| -        """return an astroid.Import node as string"""
 | 
| +        """return an astng.Import node as string"""
 | 
|          return 'import %s' % _import_string(node.names)
 | 
|  
 | 
|      def visit_keyword(self, node):
 | 
| -        """return an astroid.Keyword node as string"""
 | 
| +        """return an astng.Keyword node as string"""
 | 
|          return '%s=%s' % (node.arg, node.value.accept(self))
 | 
|  
 | 
|      def visit_lambda(self, node):
 | 
| -        """return an astroid.Lambda node as string"""
 | 
| -        return 'lambda %s: %s' % (node.args.accept(self),
 | 
| -                                  node.body.accept(self))
 | 
| +        """return an astng.Lambda node as string"""
 | 
| +        return 'lambda %s: %s' % (node.args.accept(self), node.body.accept(self))
 | 
|  
 | 
|      def visit_list(self, node):
 | 
| -        """return an astroid.List node as string"""
 | 
| +        """return an astng.List node as string"""
 | 
|          return '[%s]' % ', '.join([child.accept(self) for child in node.elts])
 | 
|  
 | 
|      def visit_listcomp(self, node):
 | 
| -        """return an astroid.ListComp node as string"""
 | 
| -        return '[%s %s]' % (node.elt.accept(self),
 | 
| -                            ' '.join([n.accept(self) for n in node.generators]))
 | 
| +        """return an astng.ListComp node as string"""
 | 
| +        return '[%s %s]' % (node.elt.accept(self), ' '.join([n.accept(self)
 | 
| +                                                for n in node.generators]))
 | 
|  
 | 
|      def visit_module(self, node):
 | 
| -        """return an astroid.Module node as string"""
 | 
| +        """return an astng.Module node as string"""
 | 
|          docs = node.doc and '"""%s"""\n\n' % node.doc or ''
 | 
|          return docs + '\n'.join([n.accept(self) for n in node.body]) + '\n\n'
 | 
|  
 | 
|      def visit_name(self, node):
 | 
| -        """return an astroid.Name node as string"""
 | 
| +        """return an astng.Name node as string"""
 | 
|          return node.name
 | 
|  
 | 
|      def visit_pass(self, node):
 | 
| -        """return an astroid.Pass node as string"""
 | 
| +        """return an astng.Pass node as string"""
 | 
|          return 'pass'
 | 
|  
 | 
|      def visit_print(self, node):
 | 
| -        """return an astroid.Print node as string"""
 | 
| +        """return an astng.Print node as string"""
 | 
|          nodes = ', '.join([n.accept(self) for n in node.values])
 | 
|          if not node.nl:
 | 
|              nodes = '%s,' % nodes
 | 
| @@ -341,40 +296,40 @@ class AsStringVisitor(object):
 | 
|          return 'print %s' % nodes
 | 
|  
 | 
|      def visit_raise(self, node):
 | 
| -        """return an astroid.Raise node as string"""
 | 
| +        """return an astng.Raise node as string"""
 | 
|          if node.exc:
 | 
|              if node.inst:
 | 
|                  if node.tback:
 | 
|                      return 'raise %s, %s, %s' % (node.exc.accept(self),
 | 
| -                                                 node.inst.accept(self),
 | 
| -                                                 node.tback.accept(self))
 | 
| +                                                node.inst.accept(self),
 | 
| +                                                node.tback.accept(self))
 | 
|                  return 'raise %s, %s' % (node.exc.accept(self),
 | 
| -                                         node.inst.accept(self))
 | 
| +                                        node.inst.accept(self))
 | 
|              return 'raise %s' % node.exc.accept(self)
 | 
|          return 'raise'
 | 
|  
 | 
|      def visit_return(self, node):
 | 
| -        """return an astroid.Return node as string"""
 | 
| +        """return an astng.Return node as string"""
 | 
|          if node.value:
 | 
|              return 'return %s' % node.value.accept(self)
 | 
|          else:
 | 
|              return 'return'
 | 
|  
 | 
|      def visit_index(self, node):
 | 
| -        """return a astroid.Index node as string"""
 | 
| +        """return a astng.Index node as string"""
 | 
|          return node.value.accept(self)
 | 
|  
 | 
|      def visit_set(self, node):
 | 
| -        """return an astroid.Set node as string"""
 | 
| +        """return an astng.Set node as string"""
 | 
|          return '{%s}' % ', '.join([child.accept(self) for child in node.elts])
 | 
|  
 | 
|      def visit_setcomp(self, node):
 | 
| -        """return an astroid.SetComp node as string"""
 | 
| -        return '{%s %s}' % (node.elt.accept(self),
 | 
| -                            ' '.join([n.accept(self) for n in node.generators]))
 | 
| +        """return an astng.SetComp node as string"""
 | 
| +        return '{%s %s}' % (node.elt.accept(self), ' '.join([n.accept(self)
 | 
| +                                                for n in node.generators]))
 | 
|  
 | 
|      def visit_slice(self, node):
 | 
| -        """return a astroid.Slice node as string"""
 | 
| +        """return a astng.Slice node as string"""
 | 
|          lower = node.lower and node.lower.accept(self) or ''
 | 
|          upper = node.upper and node.upper.accept(self) or ''
 | 
|          step = node.step and node.step.accept(self) or ''
 | 
| @@ -383,12 +338,12 @@ class AsStringVisitor(object):
 | 
|          return  '%s:%s' % (lower, upper)
 | 
|  
 | 
|      def visit_subscript(self, node):
 | 
| -        """return an astroid.Subscript node as string"""
 | 
| +        """return an astng.Subscript node as string"""
 | 
|          return '%s[%s]' % (node.value.accept(self), node.slice.accept(self))
 | 
|  
 | 
|      def visit_tryexcept(self, node):
 | 
| -        """return an astroid.TryExcept node as string"""
 | 
| -        trys = ['try:\n%s' % self._stmt_list(node.body)]
 | 
| +        """return an astng.TryExcept node as string"""
 | 
| +        trys = ['try:\n%s' % self._stmt_list( node.body)]
 | 
|          for handler in node.handlers:
 | 
|              trys.append(handler.accept(self))
 | 
|          if node.orelse:
 | 
| @@ -396,18 +351,16 @@ class AsStringVisitor(object):
 | 
|          return '\n'.join(trys)
 | 
|  
 | 
|      def visit_tryfinally(self, node):
 | 
| -        """return an astroid.TryFinally node as string"""
 | 
| -        return 'try:\n%s\nfinally:\n%s' % (self._stmt_list(node.body),
 | 
| -                                           self._stmt_list(node.finalbody))
 | 
| +        """return an astng.TryFinally node as string"""
 | 
| +        return 'try:\n%s\nfinally:\n%s' % (self._stmt_list( node.body),
 | 
| +                                        self._stmt_list(node.finalbody))
 | 
|  
 | 
|      def visit_tuple(self, node):
 | 
| -        """return an astroid.Tuple node as string"""
 | 
| -        if len(node.elts) == 1:
 | 
| -            return '(%s, )' % node.elts[0].accept(self)
 | 
| +        """return an astng.Tuple node as string"""
 | 
|          return '(%s)' % ', '.join([child.accept(self) for child in node.elts])
 | 
|  
 | 
|      def visit_unaryop(self, node):
 | 
| -        """return an astroid.UnaryOp node as string"""
 | 
| +        """return an astng.UnaryOp node as string"""
 | 
|          if node.op == 'not':
 | 
|              operator = 'not '
 | 
|          else:
 | 
| @@ -415,7 +368,7 @@ class AsStringVisitor(object):
 | 
|          return '%s%s' % (operator, node.operand.accept(self))
 | 
|  
 | 
|      def visit_while(self, node):
 | 
| -        """return an astroid.While node as string"""
 | 
| +        """return an astng.While node as string"""
 | 
|          whiles = 'while %s:\n%s' % (node.test.accept(self),
 | 
|                                      self._stmt_list(node.body))
 | 
|          if node.orelse:
 | 
| @@ -423,20 +376,16 @@ class AsStringVisitor(object):
 | 
|          return whiles
 | 
|  
 | 
|      def visit_with(self, node): # 'with' without 'as' is possible
 | 
| -        """return an astroid.With node as string"""
 | 
| -        items = ', '.join(('(%s)' % expr.accept(self)) +
 | 
| -                          (vars and ' as (%s)' % (vars.accept(self)) or '')
 | 
| -                          for expr, vars in node.items)
 | 
| -        return 'with %s:\n%s' % (items, self._stmt_list(node.body))
 | 
| +        """return an astng.With node as string"""
 | 
| +        as_var = node.vars and " as (%s)" % (node.vars.accept(self)) or ""
 | 
| +        withs = 'with (%s)%s:\n%s' % (node.expr.accept(self), as_var,
 | 
| +                                        self._stmt_list( node.body))
 | 
| +        return withs
 | 
|  
 | 
|      def visit_yield(self, node):
 | 
|          """yield an ast.Yield node as string"""
 | 
|          yi_val = node.value and (" " + node.value.accept(self)) or ""
 | 
| -        expr = 'yield' + yi_val
 | 
| -        if node.parent.is_statement:
 | 
| -            return expr
 | 
| -        else:
 | 
| -            return "(%s)" % (expr,)
 | 
| +        return 'yield' + yi_val
 | 
|  
 | 
|  
 | 
|  class AsStringVisitor3k(AsStringVisitor):
 | 
| @@ -446,7 +395,7 @@ class AsStringVisitor3k(AsStringVisitor):
 | 
|          if node.type:
 | 
|              if node.name:
 | 
|                  excs = 'except %s as %s' % (node.type.accept(self),
 | 
| -                                            node.name.accept(self))
 | 
| +                                        node.name.accept(self))
 | 
|              else:
 | 
|                  excs = 'except %s' % node.type.accept(self)
 | 
|          else:
 | 
| @@ -454,11 +403,11 @@ class AsStringVisitor3k(AsStringVisitor):
 | 
|          return '%s:\n%s' % (excs, self._stmt_list(node.body))
 | 
|  
 | 
|      def visit_nonlocal(self, node):
 | 
| -        """return an astroid.Nonlocal node as string"""
 | 
| +        """return an astng.Nonlocal node as string"""
 | 
|          return 'nonlocal %s' % ', '.join(node.names)
 | 
|  
 | 
|      def visit_raise(self, node):
 | 
| -        """return an astroid.Raise node as string"""
 | 
| +        """return an astng.Raise node as string"""
 | 
|          if node.exc:
 | 
|              if node.cause:
 | 
|                  return 'raise %s from %s' % (node.exc.accept(self),
 | 
| @@ -470,30 +419,9 @@ class AsStringVisitor3k(AsStringVisitor):
 | 
|          """return Starred node as string"""
 | 
|          return "*" + node.value.accept(self)
 | 
|  
 | 
| -    def visit_yieldfrom(self, node):
 | 
| -        """ Return an astroid.YieldFrom node as string. """
 | 
| -        yi_val = node.value and (" " + node.value.accept(self)) or ""
 | 
| -        expr = 'yield from' + yi_val
 | 
| -        if node.parent.is_statement:
 | 
| -            return expr
 | 
| -        else:
 | 
| -            return "(%s)" % (expr,)
 | 
| -
 | 
| -
 | 
| -def _import_string(names):
 | 
| -    """return a list of (name, asname) formatted as a string"""
 | 
| -    _names = []
 | 
| -    for name, asname in names:
 | 
| -        if asname is not None:
 | 
| -            _names.append('%s as %s' % (name, asname))
 | 
| -        else:
 | 
| -            _names.append(name)
 | 
| -    return  ', '.join(_names)
 | 
| -
 | 
| -
 | 
|  if sys.version_info >= (3, 0):
 | 
|      AsStringVisitor = AsStringVisitor3k
 | 
|  
 | 
|  # this visitor is stateless, thus it can be reused
 | 
| -to_code = AsStringVisitor()
 | 
| +as_string = AsStringVisitor()
 | 
|  
 | 
| 
 |