From a7e24a37e76014430cb38bca186a1fef08cee1d9 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 13 Jan 2019 19:55:18 +0100 Subject: [PATCH] Fix newline endings and a few parser/copy counts --- parso/python/diff.py | 11 +++-------- test/test_diff_parser.py | 30 +++++++++++++++++++++--------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/parso/python/diff.py b/parso/python/diff.py index 9f23de0..51dd82c 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -271,10 +271,9 @@ class DiffParser(object): self._parse(self._nodes_tree.parsed_until_line + 1) elif not copied_nodes: # We have copied as much as possible (but definitely not too - # much). Therefore we just parse the rest. - # We might not reach the end, because there's a statement - # that is not finished. - self._parse(until_line_new) + # much). Therefore we just parse a bit more. + self._parse(self._nodes_tree.parsed_until_line + 1) + copied_nodes = [None] else: p_children = line_stmt.parent.children index = p_children.index(line_stmt) @@ -393,10 +392,6 @@ class DiffParser(object): typ, string, start_pos, prefix = next(tokens) if '\n' in prefix or '\r' in prefix: prefix = re.sub(r'[^\n\r]+\Z', '', prefix) - else: - # This is basically the next line and it still needs to - # be parserd. - prefix = '' yield PythonToken( PythonTokenTypes.ENDMARKER, '', (start_pos[0] + line_offset, 0), diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index 5417643..924af01 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -67,8 +67,8 @@ class Differ(object): error_node = _check_error_leaves_nodes(new_module) assert expect_error_leaves == (error_node is not None), error_node - #assert diff_parser._parser_count == parsers - #assert diff_parser._copy_count == copies + assert diff_parser._parser_count == parsers + assert diff_parser._copy_count == copies return new_module @@ -726,7 +726,7 @@ def test_paren_in_strange_position(differ): differ.initialize(code1) differ.parse(code2, parsers=1, copies=2, expect_error_leaves=True) - differ.parse(code1, parsers=1, copies=1) + differ.parse(code1, parsers=0, copies=2) def insert_line_into_code(code, index, line): @@ -818,9 +818,9 @@ def test_indentation_issues(differ): ''') 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(code2, parsers=2, copies=2, expect_error_leaves=True) + differ.parse(code1, copies=2) + differ.parse(code3, parsers=2, copies=1) differ.parse(code1, parsers=1, copies=2) @@ -854,7 +854,7 @@ def test_error_dedent_issues(differ): ''') differ.initialize(code1) - differ.parse(code2, parsers=5, copies=1, expect_error_leaves=True) + differ.parse(code2, parsers=6, copies=2, expect_error_leaves=True) differ.parse(code1, parsers=1, copies=0) @@ -998,5 +998,17 @@ def test_dedent_end_positions(differ): 5} ''') differ.initialize(code1) - differ.parse(code2, copies=6, parsers=14, expect_error_leaves=True) - differ.parse(code1, copies=6, parsers=11) + differ.parse(code2, parsers=1, expect_error_leaves=True) + differ.parse(code1, parsers=1) + + +def test_special_no_newline_ending(differ): + code1 = dedent('''\ + 1 + ''') + code2 = dedent('''\ + 1 + is ''') + differ.initialize(code1) + differ.parse(code2, copies=1, parsers=1, expect_error_leaves=True) + differ.parse(code1, copies=1, parsers=0)