From 7fdc746a81a29a5f917fb41500b03c92adf40851 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Sun, 9 Jan 2011 07:55:46 +0000 Subject: [PATCH] Merged revisions 87876-87877 via svnmerge from svn+ssh://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. ........ --- Doc/library/ast.rst | 6 +++--- Lib/ast.py | 8 +++----- Lib/test/test_ast.py | 8 ++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 888ddaeb28..ae57e80496 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -167,9 +167,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() diff --git a/Lib/ast.py b/Lib/ast.py index 0b8baf752e..f8c4d3ced4 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -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*. 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 @@ -204,9 +202,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]) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index c74a30d876..de19c8a391 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -253,6 +253,14 @@ 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 + 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): node = ast.parse('foo()', mode='eval') diff --git a/Misc/ACKS b/Misc/ACKS index c34e381e65..f9a7c4054f 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -841,6 +841,7 @@ Cliff Wells Rickard Westman Jeff Wheeler Christopher White +David White Mats Wichmann Truida Wiedijk Felix Wiemann diff --git a/Misc/NEWS b/Misc/NEWS index 7af0b2c769..6af7cf9dac 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -31,6 +31,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 -- 2.40.0