Diff parser: Take care of one line function error recovery with decorator

This commit is contained in:
Dave Halter
2020-04-13 11:07:37 +02:00
parent baec4ac58f
commit 63b73a05e6
2 changed files with 31 additions and 1 deletions

View File

@@ -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)

View File

@@ -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)