diff --git a/parso/python/diff.py b/parso/python/diff.py index 103f7f6..96d4e38 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -564,6 +564,10 @@ class _NodesTree(object): Returns the number of tree nodes that were copied. """ + if tree_nodes[0].type == 'error_leaf' and tree_nodes[0].token_type == 'INDENT': + # Avoid copying error indents. Just parse them again. + return [] + self._get_insertion_node(tree_nodes[0]) new_nodes, self._working_stack = self._copy_nodes( diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index b5cf8e9..d3ae8d8 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -774,3 +774,47 @@ def test_parentheses_before_method(differ): differ.initialize(code1) differ.parse(code2, parsers=2, copies=1, expect_error_leaves=True) differ.parse(code1, parsers=1, copies=1) + + +def test_indentation_issues(differ): + code1 = dedent('''\ + class C: + def f(): + 1 + if 2: + return 3 + + def g(): + to_be_removed + pass + ''') + + code2 = dedent('''\ + class C: + def f(): + 1 + ``something``, very ``weird``). + if 2: + return 3 + + def g(): + to_be_removed + pass + ''') + + code3 = dedent('''\ + class C: + def f(): + 1 + if 2: + return 3 + + def g(): + pass + ''') + + differ.initialize(code1) + differ.parse(code2, parsers=1, copies=2, expect_error_leaves=True) + differ.parse(code1, parsers=2, copies=1) + differ.parse(code3, parsers=1, copies=1) + differ.parse(code1, parsers=1, copies=2)