[Python-checkins] gh-99341: Cover type ignore nodes when incrementing line numbers (GH-99422)

miss-islington webhook-mailer at python.org
Tue Nov 22 05:41:20 EST 2022


https://github.com/python/cpython/commit/1acdfec359fdf3db936168480be0f4157273c200
commit: 1acdfec359fdf3db936168480be0f4157273c200
branch: main
author: Batuhan Taskaya <isidentical at gmail.com>
committer: miss-islington <31488909+miss-islington at users.noreply.github.com>
date: 2022-11-22T02:41:14-08:00
summary:

gh-99341: Cover type ignore nodes when incrementing line numbers (GH-99422)

files:
A Misc/NEWS.d/next/Library/2022-11-13-02-06-56.gh-issue-99341.8-OlwB.rst
M Lib/ast.py
M Lib/test/test_ast.py

diff --git a/Lib/ast.py b/Lib/ast.py
index 1a94e9368c16..2cbc80a9835a 100644
--- a/Lib/ast.py
+++ b/Lib/ast.py
@@ -237,6 +237,12 @@ def increment_lineno(node, n=1):
     location in a file.
     """
     for child in walk(node):
+        # TypeIgnore is a special case where lineno is not an attribute
+        # but rather a field of the node itself.
+        if isinstance(child, TypeIgnore):
+            child.lineno = getattr(child, 'lineno', 0) + n
+            continue
+
         if 'lineno' in child._attributes:
             child.lineno = getattr(child, 'lineno', 0) + n
         if (
diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py
index b34644118d28..773fba87632b 100644
--- a/Lib/test/test_ast.py
+++ b/Lib/test/test_ast.py
@@ -1036,6 +1036,18 @@ def test_increment_lineno(self):
         self.assertEqual(ast.increment_lineno(src).lineno, 2)
         self.assertIsNone(ast.increment_lineno(src).end_lineno)
 
+    def test_increment_lineno_on_module(self):
+        src = ast.parse(dedent("""\
+        a = 1
+        b = 2 # type: ignore
+        c = 3
+        d = 4 # type: ignore at tag
+        """), type_comments=True)
+        ast.increment_lineno(src, n=5)
+        self.assertEqual(src.type_ignores[0].lineno, 7)
+        self.assertEqual(src.type_ignores[1].lineno, 9)
+        self.assertEqual(src.type_ignores[1].tag, '@tag')
+
     def test_iter_fields(self):
         node = ast.parse('foo()', mode='eval')
         d = dict(ast.iter_fields(node.body))
diff --git a/Misc/NEWS.d/next/Library/2022-11-13-02-06-56.gh-issue-99341.8-OlwB.rst b/Misc/NEWS.d/next/Library/2022-11-13-02-06-56.gh-issue-99341.8-OlwB.rst
new file mode 100644
index 000000000000..451561c579da
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-11-13-02-06-56.gh-issue-99341.8-OlwB.rst
@@ -0,0 +1,2 @@
+Fix :func:`ast.increment_lineno` to also cover :class:`ast.TypeIgnore` when
+changing line numbers.



More information about the Python-checkins mailing list