From 0bd17bee2c076db11dece17045d74c8e27ded4d6 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 18 Jan 2019 18:41:08 +0100 Subject: [PATCH] Fix diff parser: DEDENT as error leaves should also be ignored and reparsed --- parso/python/diff.py | 2 +- test/test_diff_parser.py | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/parso/python/diff.py b/parso/python/diff.py index 3c66b75..65a7317 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -617,7 +617,7 @@ class _NodesTree(object): # Endmarkers just distort all the checks below. Remove them. break - if node.type == 'error_leaf' and node.token_type == 'ERROR_DEDENT': + if node.type == 'error_leaf' and node.token_type in ('DEDENT', 'ERROR_DEDENT'): break # TODO this check might take a bit of time for large files. We # might want to change this to do more intelligent guessing or diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index 6f5c7f8..a88e42a 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -1172,4 +1172,30 @@ def test_error_dedent_in_between(differ): ''') differ.initialize(code1) differ.parse(code2, copies=1, parsers=1, expect_error_leaves=True) - differ.parse(code1, parsers=2, copies=1) + differ.parse(code1, copies=1, parsers=2) + + +def test_x(differ): + code1 = dedent('''\ + class SocketIO: + x + def f(): + "" + copied + a + ''') + code2 = dedent('''\ + try: + de + a + b + c + d + def f(): + "" + copied + a + ''') + differ.initialize(code1) + differ.parse(code2, copies=ANY, parsers=ANY, expect_error_leaves=True) + differ.parse(code1, copies=ANY, parsers=ANY)