From fc58d1b8e7a14657d15ae684908ccd3f72e82b00 Mon Sep 17 00:00:00 2001 From: David Halter Date: Mon, 7 Jan 2013 01:32:20 +0100 Subject: [PATCH] working extract refactorings, affects #103 --- jedi/refactoring.py | 38 ++++++++++++++++++++++++++++++++++---- test/refactor/extract.py | 13 ++++++++----- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/jedi/refactoring.py b/jedi/refactoring.py index 8883fae9..eb70be86 100644 --- a/jedi/refactoring.py +++ b/jedi/refactoring.py @@ -106,11 +106,41 @@ def extract(script, new_name): positions = [s] + call.execution.arr_el_pos + [exe.end_pos] start_pos = positions[index] end_pos = positions[index + 1][0], positions[index + 1][1] - 1 - text = new_lines[start_pos[0] - 1][start_pos[1]:end_pos[1]] + + # take full line if the start line is different from end line + e = end_pos[1] if end_pos[0] == start_pos[0] else None + start_line = new_lines[start_pos[0] - 1] + text = start_line[start_pos[1]:e] for l in range(start_pos[0], end_pos[0] - 1): - text - new_lines[start_pos[0]:end_pos[0]-1] - text = user_stmt.start_pos[1], user_stmt.end_pos[1] + text += '\n' + l + if e is None: + end_line = new_lines[end_pos[0] - 1] + text += '\n' + end_line[:end_pos[1]] + + + # remove code from new lines + t = text.lstrip() + del_start = start_pos[1] + len(text) - len(t) + + text = t.rstrip() + del_end = len(t) - len(text) + if e is None: + new_lines[end_pos[0] - 1] = end_line[end_pos[1] - del_end:] + e = len(start_line) + else: + e = e - del_end + start_line = start_line[:del_start] + new_name + start_line[e:] + new_lines[start_pos[0] - 1] = start_line + new_lines[start_pos[0]:end_pos[0]-1] = [] + + # add parentheses in multiline case + open_brackets = ['(', '[', '{'] + close_brackets = [')', ']', '}'] + if '\n' in text and not (text[0] in open_brackets and text[-1] == + close_brackets[open_brackets.index(text[0])]): + text = '(%s)' % text + + # add new line before statement new = "%s%s = %s" % (' ' * indent, new_name, text) new_lines.insert(line_index, new) dct[script.source_path] = script.source_path, old_lines, new_lines diff --git a/test/refactor/extract.py b/test/refactor/extract.py index 06c076b8..e523e6e8 100644 --- a/test/refactor/extract.py +++ b/test/refactor/extract.py @@ -1,18 +1,21 @@ # --- simple def test(): #? 25 a - return test(1, (30 + b, c) + 1) + return test(100, (30 + b, c) + 1) # +++ def test(): a = (30 + b, c) + 1 - return test(a) + return test(100, a) # --- multiline def test(): #? 30 x - return test(1, (30 + b, c) + 1) + return test(1, (30 + b, c) + + 1) # +++ def test(): - x = (30 + b, c) + 1 - return test(x) + x = ((30 + b, c) + 1 + + 1) + return test(x +)