--- a/eric7/JediInterface/JediClient.py Tue Oct 05 18:13:40 2021 +0200 +++ b/eric7/JediInterface/JediClient.py Tue Oct 05 19:36:02 2021 +0200 @@ -41,10 +41,6 @@ """ super().__init__(host, port, idString) - # TODO: add additional methods for these topics - # - extract function - # - extract variable - # - inline variable self.__methodMapping = { "openProject": self.__openProject, "closeProject": self.__closeProject, @@ -59,6 +55,7 @@ "renameVariable": self.__renameVariable, "extractVariable": self.__extractVariable, "inlineVariable": self.__inlineVariable, + "extractFunction": self.__extractFunction, "applyRefactoring": self.__applyRefactoring, "cancelRefactoring": self.__cancelRefactoring, } @@ -519,6 +516,45 @@ self.sendJson("RefactoringDiff", result) + def __extractFunction(self, params): + """ + Private method to extract an expression to a new function. + + @param params dictionary containing the method parameters + @type dict + """ + filename = params["FileName"] + source = params["Source"] + line = params["Line"] + index = params["Index"] + endLine = params["EndLine"] + endIndex = params["EndIndex"] + uid = params["Uuid"] + newName = params["NewName"] + + errorDict = {} + diff = "" + + script = jedi.Script(source, path=filename, project=self.__project) + + try: + refactoring = script.extract_function( + line, index, new_name=newName, + until_line=endLine, until_column=endIndex + ) + self.__refactorings[uid] = refactoring + diff = refactoring.get_diff() + except SuppressedException as err: + errorDict = self.__handleError(err) + + result = { + "Diff": diff, + "Uuid": uid, + } + result.update(errorDict) + + self.sendJson("RefactoringDiff", result) + def __applyRefactoring(self, params): """ Private method to apply a refactoring.