mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
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.
(cherry picked from commit 110a47c4f4
)
Co-authored-by: Carl Friedrich Bolz-Tereick <cfbolz@gmx.de>
This commit is contained in:
parent
54348f46f8
commit
c7be35c2ab
4 changed files with 34 additions and 1 deletions
|
@ -576,6 +576,36 @@ class AST_Tests(unittest.TestCase):
|
||||||
with support.swap_attr(unicodedata, 'normalize', bad_normalize):
|
with support.swap_attr(unicodedata, 'normalize', bad_normalize):
|
||||||
self.assertRaises(TypeError, ast.parse, '\u03D5')
|
self.assertRaises(TypeError, ast.parse, '\u03D5')
|
||||||
|
|
||||||
|
def test_issue18374_binop_col_offset(self):
|
||||||
|
tree = ast.parse('4+5+6+7')
|
||||||
|
parent_binop = tree.body[0].value
|
||||||
|
child_binop = parent_binop.left
|
||||||
|
grandchild_binop = child_binop.left
|
||||||
|
self.assertEqual(parent_binop.col_offset, 0)
|
||||||
|
self.assertEqual(parent_binop.end_col_offset, 7)
|
||||||
|
self.assertEqual(child_binop.col_offset, 0)
|
||||||
|
self.assertEqual(child_binop.end_col_offset, 5)
|
||||||
|
self.assertEqual(grandchild_binop.col_offset, 0)
|
||||||
|
self.assertEqual(grandchild_binop.end_col_offset, 3)
|
||||||
|
|
||||||
|
tree = ast.parse('4+5-\\\n 6-7')
|
||||||
|
parent_binop = tree.body[0].value
|
||||||
|
child_binop = parent_binop.left
|
||||||
|
grandchild_binop = child_binop.left
|
||||||
|
self.assertEqual(parent_binop.col_offset, 0)
|
||||||
|
self.assertEqual(parent_binop.lineno, 1)
|
||||||
|
self.assertEqual(parent_binop.end_col_offset, 4)
|
||||||
|
self.assertEqual(parent_binop.end_lineno, 2)
|
||||||
|
|
||||||
|
self.assertEqual(child_binop.col_offset, 0)
|
||||||
|
self.assertEqual(parent_binop.lineno, 1)
|
||||||
|
self.assertEqual(child_binop.end_col_offset, 2)
|
||||||
|
self.assertEqual(parent_binop.end_lineno, 2)
|
||||||
|
|
||||||
|
self.assertEqual(grandchild_binop.col_offset, 0)
|
||||||
|
self.assertEqual(parent_binop.lineno, 1)
|
||||||
|
self.assertEqual(grandchild_binop.end_col_offset, 3)
|
||||||
|
self.assertEqual(parent_binop.end_lineno, 2)
|
||||||
|
|
||||||
class ASTHelpers_Test(unittest.TestCase):
|
class ASTHelpers_Test(unittest.TestCase):
|
||||||
maxDiff = None
|
maxDiff = None
|
||||||
|
|
|
@ -178,6 +178,7 @@ Nikolay Bogoychev
|
||||||
David Bolen
|
David Bolen
|
||||||
Wouter Bolsterlee
|
Wouter Bolsterlee
|
||||||
Gawain Bolton
|
Gawain Bolton
|
||||||
|
Carl Friedrich Bolz-Tereick
|
||||||
Forest Bond
|
Forest Bond
|
||||||
Gregory Bond
|
Gregory Bond
|
||||||
Médéric Boquien
|
Médéric Boquien
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix the ``.col_offset`` attribute of nested :class:`ast.BinOp` instances
|
||||||
|
which had a too large value in some situations.
|
|
@ -2645,7 +2645,7 @@ ast_for_binop(struct compiling *c, const node *n)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
tmp_result = BinOp(result, newoperator, tmp,
|
tmp_result = BinOp(result, newoperator, tmp,
|
||||||
LINENO(next_oper), next_oper->n_col_offset,
|
LINENO(n), n->n_col_offset,
|
||||||
CHILD(n, i * 2 + 2)->n_end_lineno,
|
CHILD(n, i * 2 + 2)->n_end_lineno,
|
||||||
CHILD(n, i * 2 + 2)->n_end_col_offset,
|
CHILD(n, i * 2 + 2)->n_end_col_offset,
|
||||||
c->c_arena);
|
c->c_arena);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue