From 01dba7f8ce5a4e5ab1a1c3b45a4ada4c7dbbf425 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 13 Jan 2019 22:38:53 +0100 Subject: [PATCH] Fix diff parser: Need to calculate the prefix for the diff tokenizer better --- parso/python/diff.py | 4 ++++ test/test_diff_parser.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/parso/python/diff.py b/parso/python/diff.py index d9650b7..fc499bc 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -388,6 +388,10 @@ 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: + assert start_pos[1] >= len(prefix), repr(prefix) + if start_pos[1] - len(prefix) == 0: + 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 924af01..a5eb4b9 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -1012,3 +1012,25 @@ def test_special_no_newline_ending(differ): differ.initialize(code1) differ.parse(code2, copies=1, parsers=1, expect_error_leaves=True) differ.parse(code1, copies=1, parsers=0) + + +def test_random_character_insertion(differ): + code1 = dedent('''\ + def create(self): + 1 + if self.path is not None: + return + # 3 + # 4 + ''') + code2 = dedent('''\ + def create(self): + 1 + if 2: + x return + # 3 + # 4 + ''') + differ.initialize(code1) + differ.parse(code2, copies=1, parsers=3, expect_error_leaves=True) + differ.parse(code1, copies=1, parsers=1)