Skip to content

Commit 110a47c

Browse files
cfbolzilevkivskyi
authored andcommitted
bpo-18374: fix wrong col_offset of some ast.BinOp instances (GH-14607)
Nested BinOp instances (e.g. a+b+c) had a wrong col_offset for the second BinOp (e.g. 2 instead of 0 in the example). Fix it by using the correct st node to copy the line and col_offset from in ast.c.
1 parent 66b4150 commit 110a47c

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

Lib/test/test_ast.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,36 @@ def bad_normalize(*args):
576576
with support.swap_attr(unicodedata, 'normalize', bad_normalize):
577577
self.assertRaises(TypeError, ast.parse, '\u03D5')
578578

579+
def test_issue18374_binop_col_offset(self):
580+
tree = ast.parse('4+5+6+7')
581+
parent_binop = tree.body[0].value
582+
child_binop = parent_binop.left
583+
grandchild_binop = child_binop.left
584+
self.assertEqual(parent_binop.col_offset, 0)
585+
self.assertEqual(parent_binop.end_col_offset, 7)
586+
self.assertEqual(child_binop.col_offset, 0)
587+
self.assertEqual(child_binop.end_col_offset, 5)
588+
self.assertEqual(grandchild_binop.col_offset, 0)
589+
self.assertEqual(grandchild_binop.end_col_offset, 3)
590+
591+
tree = ast.parse('4+5-\\\n 6-7')
592+
parent_binop = tree.body[0].value
593+
child_binop = parent_binop.left
594+
grandchild_binop = child_binop.left
595+
self.assertEqual(parent_binop.col_offset, 0)
596+
self.assertEqual(parent_binop.lineno, 1)
597+
self.assertEqual(parent_binop.end_col_offset, 4)
598+
self.assertEqual(parent_binop.end_lineno, 2)
599+
600+
self.assertEqual(child_binop.col_offset, 0)
601+
self.assertEqual(parent_binop.lineno, 1)
602+
self.assertEqual(child_binop.end_col_offset, 2)
603+
self.assertEqual(parent_binop.end_lineno, 2)
604+
605+
self.assertEqual(grandchild_binop.col_offset, 0)
606+
self.assertEqual(parent_binop.lineno, 1)
607+
self.assertEqual(grandchild_binop.end_col_offset, 3)
608+
self.assertEqual(parent_binop.end_lineno, 2)
579609

580610
class ASTHelpers_Test(unittest.TestCase):
581611
maxDiff = None

Misc/ACKS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ Nikolay Bogoychev
178178
David Bolen
179179
Wouter Bolsterlee
180180
Gawain Bolton
181+
Carl Friedrich Bolz-Tereick
181182
Forest Bond
182183
Gregory Bond
183184
Médéric Boquien
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` instances
2+
which had a too large value in some situations.

Python/ast.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2645,7 +2645,7 @@ ast_for_binop(struct compiling *c, const node *n)
26452645
return NULL;
26462646

26472647
tmp_result = BinOp(result, newoperator, tmp,
2648-
LINENO(next_oper), next_oper->n_col_offset,
2648+
LINENO(n), n->n_col_offset,
26492649
CHILD(n, i * 2 + 2)->n_end_lineno,
26502650
CHILD(n, i * 2 + 2)->n_end_col_offset,
26512651
c->c_arena);

0 commit comments

Comments
 (0)