Merged revisions 87876-87877 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r87876 | georg.brandl | 2011-01-09 08:38:51 +0100 (So, 09 Jan 2011) | 1 line

  #10869: do not visit root node twice in ast.increment_lineno().
........
  r87877 | georg.brandl | 2011-01-09 08:50:48 +0100 (So, 09 Jan 2011) | 1 line

  Add missing line.
........
This commit is contained in:
Georg Brandl 2011-01-09 07:53:14 +00:00
parent cec4b4fa04
commit 6adb97939b
5 changed files with 18 additions and 8 deletions

View File

@ -187,9 +187,9 @@ and classes for traversing abstract syntax trees:
.. function:: walk(node) .. function:: walk(node)
Recursively yield all child nodes of *node*, in no specified order. This is Recursively yield all descendant nodes in the tree starting at *node*
useful if you only want to modify nodes in place and don't care about the (including *node* itself), in no specified order. This is useful if you only
context. want to modify nodes in place and don't care about the context.
.. class:: NodeVisitor() .. class:: NodeVisitor()

View File

@ -152,8 +152,6 @@ def increment_lineno(node, n=1):
Increment the line number of each node in the tree starting at *node* by *n*. Increment the line number of each node in the tree starting at *node* by *n*.
This is useful to "move code" to a different location in a file. This is useful to "move code" to a different location in a file.
""" """
if 'lineno' in node._attributes:
node.lineno = getattr(node, 'lineno', 0) + n
for child in walk(node): for child in walk(node):
if 'lineno' in child._attributes: if 'lineno' in child._attributes:
child.lineno = getattr(child, 'lineno', 0) + n child.lineno = getattr(child, 'lineno', 0) + n
@ -204,9 +202,9 @@ def get_docstring(node, clean=True):
def walk(node): def walk(node):
""" """
Recursively yield all child nodes of *node*, in no specified order. This is Recursively yield all descendant nodes in the tree starting at *node*
useful if you only want to modify nodes in place and don't care about the (including *node* itself), in no specified order. This is useful if you
context. only want to modify nodes in place and don't care about the context.
""" """
from collections import deque from collections import deque
todo = deque([node]) todo = deque([node])

View File

@ -264,6 +264,14 @@ class ASTHelpers_Test(unittest.TestCase):
'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, ' 'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
'col_offset=0))' 'col_offset=0))'
) )
# issue10869: do not increment lineno of root twice
src = ast.parse('1 + 1', mode='eval')
self.assertEqual(ast.increment_lineno(src.body, n=3), src.body)
self.assertEqual(ast.dump(src, include_attributes=True),
'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
'col_offset=0))'
)
def test_iter_fields(self): def test_iter_fields(self):
node = ast.parse('foo()', mode='eval') node = ast.parse('foo()', mode='eval')

View File

@ -848,6 +848,7 @@ Cliff Wells
Rickard Westman Rickard Westman
Jeff Wheeler Jeff Wheeler
Christopher White Christopher White
David White
Mats Wichmann Mats Wichmann
Truida Wiedijk Truida Wiedijk
Felix Wiemann Felix Wiemann

View File

@ -36,6 +36,9 @@ Library
dependent, but ``time.mktime`` will now accept full range supported dependent, but ``time.mktime`` will now accept full range supported
by the OS. Conversion of 2-digit years to 4-digit is deprecated. by the OS. Conversion of 2-digit years to 4-digit is deprecated.
- Issue #10869: Fixed bug where ast.increment_lineno modified the root
node twice.
- Issue #7858: Raise an error properly when os.utime() fails under Windows - Issue #7858: Raise an error properly when os.utime() fails under Windows
on an existing file. on an existing file.