From 20fd32b45d258684ed1896fbb1a1df41a211378c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 14 Jan 2019 21:36:10 +0100 Subject: [PATCH] Fix diff parser: Avoid side effects for prefix --- parso/python/diff.py | 14 +++++--------- test/test_diff_parser.py | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/parso/python/diff.py b/parso/python/diff.py index 203467a..cda422a 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -572,7 +572,7 @@ class _NodesTree(object): self._get_insertion_node(tree_nodes[0]) - new_nodes, self._working_stack = self._copy_nodes( + new_nodes, self._working_stack, self.prefix = self._copy_nodes( list(self._working_stack), tree_nodes, until_line, @@ -611,7 +611,7 @@ class _NodesTree(object): new_nodes.append(node) if not new_nodes: - return [], working_stack + return [], working_stack, prefix tos = working_stack[-1] last_node = new_nodes[-1] @@ -624,7 +624,7 @@ class _NodesTree(object): suite_tos = _NodesTreeNode(suite) # Don't need to pass line_offset here, it's already done by the # parent. - suite_nodes, new_working_stack = self._copy_nodes( + suite_nodes, new_working_stack, new_prefix = self._copy_nodes( working_stack + [suite_tos], suite.children, until_line, line_offset ) if len(suite_nodes) < 2: @@ -666,14 +666,10 @@ class _NodesTree(object): else: last_line_offset_leaf = new_nodes[-1].get_last_leaf() tos.add_tree_nodes(prefix, new_nodes, line_offset, last_line_offset_leaf) - self.prefix = new_prefix + prefix = new_prefix self._prefix_remainder = '' - else: - # Need to reset the prefix, because it might have been reset higher - # up in the stack. - self.prefix = prefix - return new_nodes, working_stack + return new_nodes, working_stack, prefix def close(self): self._base_node.finish() diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index fea77fa..53fa79f 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -1052,3 +1052,20 @@ def test_import_opening_bracket(differ): differ.initialize(code1) differ.parse(code2, copies=1, parsers=2, expect_error_leaves=True) differ.parse(code1, copies=1, parsers=2, expect_error_leaves=True) + + +def test_opening_bracket_at_end(differ): + code1 = dedent('''\ + class C: + 1 + [ + ''') + code2 = dedent('''\ + 3 + class C: + 1 + [ + ''') + differ.initialize(code1) + differ.parse(code2, copies=1, parsers=2, expect_error_leaves=True) + differ.parse(code1, copies=1, parsers=1, expect_error_leaves=True)