Skip to content

Commit e6578a2

Browse files
bpo-40662: Fixed ast.get_source_segment for ast nodes that have incomplete location information (GH-20157)
Co-authored-by: Pablo Galindo <[email protected]>
1 parent 63b8e0c commit e6578a2

File tree

3 files changed

+14
-0
lines changed

3 files changed

+14
-0
lines changed

Lib/ast.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ def get_source_segment(source, node, *, padded=False):
332332
be padded with spaces to match its original position.
333333
"""
334334
try:
335+
if node.end_lineno is None or node.end_col_offset is None:
336+
return None
335337
lineno = node.lineno - 1
336338
end_lineno = node.end_lineno - 1
337339
col_offset = node.col_offset

Lib/test/test_ast.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,17 @@ class C:
18511851
cdef = ast.parse(s).body[0]
18521852
self.assertEqual(ast.get_source_segment(s, cdef.body[0], padded=True), s_method)
18531853

1854+
def test_source_segment_missing_info(self):
1855+
s = 'v = 1\r\nw = 1\nx = 1\n\ry = 1\r\n'
1856+
v, w, x, y = ast.parse(s).body
1857+
del v.lineno
1858+
del w.end_lineno
1859+
del x.col_offset
1860+
del y.end_col_offset
1861+
self.assertIsNone(ast.get_source_segment(s, v))
1862+
self.assertIsNone(ast.get_source_segment(s, w))
1863+
self.assertIsNone(ast.get_source_segment(s, x))
1864+
self.assertIsNone(ast.get_source_segment(s, y))
18541865

18551866
class NodeVisitorTests(unittest.TestCase):
18561867
def test_old_constant_nodes(self):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed :func:`ast.get_source_segment` for ast nodes that have incomplete location information. Patch by Irit Katriel.

0 commit comments

Comments
 (0)