From 6eba40b4c5d8ea1dfea275e559abac8e8218605c Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 6 Jan 2019 01:00:26 +0100 Subject: [PATCH] Fix diff parser: error dedent issues --- parso/python/diff.py | 3 +++ test/test_diff_parser.py | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/parso/python/diff.py b/parso/python/diff.py index 96d4e38..b373073 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -87,6 +87,9 @@ def _get_last_line(node_or_leaf): def _ends_with_newline(leaf, suffix=''): + while leaf.type == 'error_leaf' and leaf.token_type == 'DEDENT': + leaf = leaf.get_previous_leaf() + if leaf.type == 'error_leaf': typ = leaf.token_type.lower() else: diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index d3ae8d8..a41049e 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -818,3 +818,37 @@ def test_indentation_issues(differ): differ.parse(code1, parsers=2, copies=1) differ.parse(code3, parsers=1, copies=1) differ.parse(code1, parsers=1, copies=2) + + +def test_x(differ): + code1 = dedent('''\ + while True: + try: + 1 + except KeyError: + if 2: + 3 + except IndexError: + 4 + + 5 + ''') + + code2 = dedent('''\ + while True: + try: + except KeyError: + 1 + except KeyError: + if 2: + 3 + except IndexError: + 4 + + something_inserted + 5 + ''') + + differ.initialize(code1) + differ.parse(code2, parsers=5, copies=1, expect_error_leaves=True) + differ.parse(code1, parsers=1, copies=0)