mirror of https://github.com/python/cpython
gh-99341: Cover type ignore nodes when incrementing line numbers (GH-99422)
This commit is contained in:
parent
bc3a11d21d
commit
1acdfec359
|
@ -237,6 +237,12 @@ def increment_lineno(node, n=1):
|
||||||
location in a file.
|
location in a file.
|
||||||
"""
|
"""
|
||||||
for child in walk(node):
|
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:
|
if 'lineno' in child._attributes:
|
||||||
child.lineno = getattr(child, 'lineno', 0) + n
|
child.lineno = getattr(child, 'lineno', 0) + n
|
||||||
if (
|
if (
|
||||||
|
|
|
@ -1036,6 +1036,18 @@ Module(
|
||||||
self.assertEqual(ast.increment_lineno(src).lineno, 2)
|
self.assertEqual(ast.increment_lineno(src).lineno, 2)
|
||||||
self.assertIsNone(ast.increment_lineno(src).end_lineno)
|
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@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):
|
def test_iter_fields(self):
|
||||||
node = ast.parse('foo()', mode='eval')
|
node = ast.parse('foo()', mode='eval')
|
||||||
d = dict(ast.iter_fields(node.body))
|
d = dict(ast.iter_fields(node.body))
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix :func:`ast.increment_lineno` to also cover :class:`ast.TypeIgnore` when
|
||||||
|
changing line numbers.
|
Loading…
Reference in New Issue