mirror of https://github.com/python/cpython
#10869: do not visit root node twice in ast.increment_lineno().
This commit is contained in:
parent
5b2d9ddf69
commit
619e7ba814
|
@ -173,9 +173,9 @@ and classes for traversing abstract syntax trees:
|
|||
|
||||
.. function:: walk(node)
|
||||
|
||||
Recursively yield all child nodes of *node*, in no specified order. This is
|
||||
useful if you only want to modify nodes in place and don't care about the
|
||||
context.
|
||||
Recursively yield all descendant nodes in the tree starting at *node*
|
||||
(including *node* itself), in no specified order. This is useful if you only
|
||||
want to modify nodes in place and don't care about the context.
|
||||
|
||||
|
||||
.. class:: NodeVisitor()
|
||||
|
|
|
@ -159,8 +159,6 @@ def increment_lineno(node, n=1):
|
|||
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.
|
||||
"""
|
||||
if 'lineno' in node._attributes:
|
||||
node.lineno = getattr(node, 'lineno', 0) + n
|
||||
for child in walk(node):
|
||||
if 'lineno' in child._attributes:
|
||||
child.lineno = getattr(child, 'lineno', 0) + n
|
||||
|
@ -211,9 +209,9 @@ def get_docstring(node, clean=True):
|
|||
|
||||
def walk(node):
|
||||
"""
|
||||
Recursively yield all child nodes of *node*, in no specified order. This is
|
||||
useful if you only want to modify nodes in place and don't care about the
|
||||
context.
|
||||
Recursively yield all descendant nodes in the tree starting at *node*
|
||||
(including *node* itself), in no specified order. This is useful if you
|
||||
only want to modify nodes in place and don't care about the context.
|
||||
"""
|
||||
from collections import deque
|
||||
todo = deque([node])
|
||||
|
|
|
@ -264,6 +264,13 @@ class ASTHelpers_Test(unittest.TestCase):
|
|||
'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
|
||||
'col_offset=0))'
|
||||
)
|
||||
# issue10869: do not increment lineno of root twice
|
||||
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):
|
||||
node = ast.parse('foo()', mode='eval')
|
||||
|
|
|
@ -905,6 +905,7 @@ Cliff Wells
|
|||
Rickard Westman
|
||||
Jeff Wheeler
|
||||
Christopher White
|
||||
David White
|
||||
Mats Wichmann
|
||||
Truida Wiedijk
|
||||
Felix Wiemann
|
||||
|
|
|
@ -40,6 +40,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #10869: Fixed bug where ast.increment_lineno modified the root
|
||||
node twice.
|
||||
|
||||
- Issue #5871: email.header.Header.encode now raises an error if any
|
||||
continuation line in the formatted value has no leading white space
|
||||
and looks like a header. Since Generator uses Header to format all
|
||||
|
|
Loading…
Reference in New Issue