diff --git a/parso/python/diff.py b/parso/python/diff.py index fc499bc..203467a 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -476,8 +476,6 @@ class _NodesTreeNode(object): class _NodesTree(object): - endmarker_type = 'endmarker' - def __init__(self, module): self._base_node = _NodesTreeNode(module) self._working_stack = [self._base_node] @@ -543,7 +541,7 @@ class _NodesTree(object): Helps cleaning up the tree nodes that get inserted. """ last_leaf = tree_nodes[-1].get_last_leaf() - is_endmarker = last_leaf.type == self.endmarker_type + is_endmarker = last_leaf.type == 'endmarker' self._prefix_remainder = '' if is_endmarker: separation = max(last_leaf.prefix.rfind('\n'), last_leaf.prefix.rfind('\r')) @@ -632,6 +630,7 @@ class _NodesTree(object): if len(suite_nodes) < 2: # A suite only with newline is not valid. new_nodes.pop() + new_prefix = '' else: assert new_nodes tos.add_child_node(suite_tos) @@ -649,6 +648,7 @@ class _NodesTree(object): # If we copy flows at the end, they might be continued # after the copy limit (in the new parser). # In this while loop we try to remove until we find a newline. + new_prefix = '' new_nodes.pop() while new_nodes: last_node = new_nodes[-1] diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index 4d68b9c..fea77fa 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -49,6 +49,8 @@ class Differ(object): self.lines = split_lines(code, keepends=True) self.module = parse(code, diff_cache=True, cache=True) + assert code == self.module.get_code() + _assert_valid_graph(self.module) return self.module def parse(self, code, copies=0, parsers=0, expect_error_leaves=False): @@ -1034,3 +1036,19 @@ def test_random_character_insertion(differ): differ.initialize(code1) differ.parse(code2, copies=1, parsers=3, expect_error_leaves=True) differ.parse(code1, copies=1, parsers=1) + + +def test_import_opening_bracket(differ): + code1 = dedent('''\ + 1 + 2 + from bubu import (X, + ''') + code2 = dedent('''\ + 11 + 2 + from bubu import (X, + ''') + 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)