--- a/RefactoringRope/RefactoringClient.py Tue Sep 19 19:40:18 2017 +0200 +++ b/RefactoringRope/RefactoringClient.py Wed Sep 20 19:49:26 2017 +0200 @@ -62,6 +62,7 @@ "CalculateRenameChanges": self.__calculateRenameChanges, "CalculateChangeOccurrencesChanges": self.__calculateChangeOccurrencesChanges, + "CalculateExtractChanges": self.__calculateExtractChanges, } from FileSystemCommands import RefactoringClientFileSystemCommands @@ -599,8 +600,8 @@ def __calculateChangeOccurrencesChanges(self, params): """ - Private method to calculate the rename changes based on the parameters - sent by the server. + Private method to calculate the 'Change Occurrences' changes based on + the parameters sent by the server. @param params dictionary containing the method parameters sent by the server @@ -646,6 +647,63 @@ result.update(errorDict) self.sendJson("Changes", result) + + def __calculateExtractChanges(self, params): + """ + Private method to calculate the 'Extract' changes based on the + parameters sent by the server. + + @param params dictionary containing the method parameters sent by + the server + @type dict + """ + changeGroup = params["ChangeGroup"] + title = params["Title"] + filename = params["FileName"] + startOffset = params["StartOffset"] + endOffset = params["EndOffset"] + kind = params["Kind"] + newName = params["NewName"] + similar = params["Similar"] + global_ = params["Global"] + + errorDict = {} + changes = [] + result = { + "ChangeGroup": changeGroup, + "Title": title, + } + + import rope.refactor.extract + resource = rope.base.libutils.path_to_resource( + self.__project, filename) + try: + if kind == "variable": + extractor = rope.refactor.extract.ExtractVariable( + self.__project, resource, startOffset, endOffset) + elif kind == "method": + extractor = rope.refactor.extract.ExtractMethod( + self.__project, resource, startOffset, endOffset) + else: + raise Exception("Invalid extraction kind <{0}>.".format(kind)) + except Exception as err: + errorDict = self.__handleRopeError(err) + result.update(errorDict) + self.sendJson("Changes", result) + return + + try: + changes = extractor.get_changes( + newName, similar=similar, global_=global_) + except Exception as err: + errorDict = self.__handleRopeError(err) + + self.__changes[changeGroup] = changes + + result["Subcommand"] = "ChangesCalculated" + result.update(errorDict) + + self.sendJson("Changes", result) if __name__ == '__main__': if len(sys.argv) != 4: