diff --git a/jedi/api/refactoring.py b/jedi/api/refactoring.py index 55c8b026..1f4ef917 100644 --- a/jedi/api/refactoring.py +++ b/jedi/api/refactoring.py @@ -409,6 +409,7 @@ def extract_function(inference_state, path, module_context, name, pos, until_pos function_param_names = context.get_value().get_param_names() if len(function_param_names): self_param = function_param_names[0].string_name + params = [p for p in params if p != self_param] if function_is_classmethod(context.tree_node): decorator = '@classmethod\n' @@ -416,12 +417,15 @@ def extract_function(inference_state, path, module_context, name, pos, until_pos code_block += '\n' function_code = '%sdef %s(%s):\n%s' % ( - decorator, name, ', '.join(params), indent_block(code_block) + decorator, + name, + ', '.join(params if self_param is None else [self_param] + params), + indent_block(code_block) ) function_call = '%s(%s)' % ( ('' if self_param is None else self_param + '.') + name, - ', '.join(p for p in params if p != self_param) + ', '.join(params) ) if is_expression: replacement = function_call diff --git a/test/refactor/extract_function.py b/test/refactor/extract_function.py index 04eae596..adf435be 100644 --- a/test/refactor/extract_function.py +++ b/test/refactor/extract_function.py @@ -82,6 +82,19 @@ class X: def f(self, b, c): #? 11 text {'new_name': 'ab'} return self.ab(b) +# -------------------------------------------------- in-method-order +class X: + def f(self, b, c): + #? 18 text {'new_name': 'b'} + return b | self.a +# ++++++++++++++++++++++++++++++++++++++++++++++++++ +class X: + def b(self, b): + return b | self.a + + def f(self, b, c): + #? 18 text {'new_name': 'b'} + return self.b(b) # -------------------------------------------------- in-classmethod-1 class X: @classmethod @@ -91,7 +104,7 @@ class X: # ++++++++++++++++++++++++++++++++++++++++++++++++++ class X: @classmethod - def ab(): + def ab(x): return 25 @classmethod