diff --git a/parso/python/diff.py b/parso/python/diff.py index ba1c940..c2e03c9 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -735,7 +735,17 @@ class _NodesTree(object): # suites like `def foo(): bar.-`. In this case we might not # include a newline in the statement and we need to take care # of that. - if c[-1].type in ('error_leaf', 'error_node'): + n = node + if n.type == 'decorated': + n = n.children[-1] + if n.type in ('async_funcdef', 'async_stmt'): + n = n.children[-1] + if n.type in ('classdef', 'funcdef'): + suite_node = n.children[-1] + else: + suite_node = c[-1] + + if suite_node.type in ('error_leaf', 'error_node'): break new_nodes.append(node) diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index ea2a692..1904314 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -1728,3 +1728,23 @@ def test_one_line_function_error_recovery(differ): differ.initialize(code1) differ.parse(code2, parsers=1, copies=1, expect_error_leaves=True) + + +def test_one_line_property_error_recovery(differ): + code1 = dedent('''\ + class X: + x + @property + def encoding(self): True - + return 1 + ''') + code2 = dedent('''\ + class X: + x + @property + def encoding(self): True - + return 1 + ''') + + differ.initialize(code1) + differ.parse(code2, parsers=2, copies=1, expect_error_leaves=True)