From 96ae6a078bd89c56916e122e6aa7b83bcc5d529b Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 2 Jan 2019 13:16:22 +0100 Subject: [PATCH] Fix diff parser: positioning of functions if decorators were removed --- parso/python/diff.py | 6 +++++- test/test_diff_parser.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/parso/python/diff.py b/parso/python/diff.py index c4853ed..f73d919 100644 --- a/parso/python/diff.py +++ b/parso/python/diff.py @@ -638,7 +638,11 @@ class _NodesTree(object): if new_nodes: if had_valid_suite_last: - last_line_offset_leaf = new_nodes[-1].children[-2].get_last_leaf() + last = new_nodes[-1] + if last.type == 'decorated': + last = last.children[-1] + last_line_offset_leaf = last.children[-2].get_last_leaf() + assert last_line_offset_leaf == ':' else: last_line_offset_leaf = new_nodes[-1].get_last_leaf() tos.add_tree_nodes(new_nodes, line_offset, last_line_offset_leaf) diff --git a/test/test_diff_parser.py b/test/test_diff_parser.py index 91e1f36..d4666c7 100644 --- a/test/test_diff_parser.py +++ b/test/test_diff_parser.py @@ -665,3 +665,39 @@ def test_function_deletion(differ): differ.initialize(code1) differ.parse(code2, parsers=1, copies=0, expect_error_leaves=True) differ.parse(code1, parsers=1, copies=0) + + +def test_docstring_removal(differ): + code1 = dedent('''\ + class E(Exception): + """ + 1 + 2 + 3 + """ + + class S(object): + @property + def f(self): + return cmd + def __repr__(self): + return cmd2 + ''') + + code2 = dedent('''\ + class E(Exception): + """ + 1 + 3 + """ + + class S(object): + @property + def f(self): + return cmd + return cmd2 + ''') + + differ.initialize(code1) + differ.parse(code2, parsers=1, copies=2) + differ.parse(code1, parsers=2, copies=1)