8 """ |
8 """ |
9 |
9 |
10 import contextlib |
10 import contextlib |
11 import os |
11 import os |
12 import sys |
12 import sys |
|
13 import traceback |
13 |
14 |
14 modulePath = sys.argv[-1] # it is always the last parameter |
15 modulePath = sys.argv[-1] # it is always the last parameter |
15 sys.path.append(modulePath) |
16 sys.path.append(modulePath) |
16 |
17 |
17 try: |
18 try: |
18 import rope.base.libutils |
19 import rope.base.libutils |
19 import rope.base.project |
20 import rope.base.project |
|
21 import rope.contrib.findit |
|
22 import rope.refactor.change_signature |
|
23 import rope.refactor.encapsulate_field |
|
24 import rope.refactor.extract |
|
25 import rope.refactor.inline |
|
26 import rope.refactor.introduce_factory |
|
27 import rope.refactor.introduce_parameter |
|
28 import rope.refactor.localtofield |
|
29 import rope.refactor.method_object |
|
30 import rope.refactor.move |
|
31 import rope.refactor.rename |
|
32 import rope.refactor.restructure |
|
33 import rope.refactor.topackage |
|
34 import rope.refactor.usefunction |
|
35 |
|
36 from rope.refactor.importutils import ImportOrganizer |
20 except ImportError: |
37 except ImportError: |
21 sys.exit(42) |
38 sys.exit(42) |
22 |
39 |
23 from ProgressHandle import ProgressHandle |
40 from ProgressHandle import ProgressHandle |
24 |
41 |
39 @param port port of the background service |
56 @param port port of the background service |
40 @type int |
57 @type int |
41 @param projectPath path to the project |
58 @param projectPath path to the project |
42 @type str |
59 @type str |
43 """ |
60 """ |
|
61 from FileSystemCommands import RefactoringClientFileSystemCommands # noqa: I102 |
|
62 |
44 super().__init__(host, port) |
63 super().__init__(host, port) |
45 |
64 |
46 self.__methodMapping = { |
65 self.__methodMapping = { |
47 "AbortAction": self.__abortAction, |
66 "AbortAction": self.__abortAction, |
48 "CloseProject": self.__closeProject, |
67 "CloseProject": self.__closeProject, |
85 "CalculateEncapsulateFieldChanges": self.__calculateEncapsulateFieldChanges, |
104 "CalculateEncapsulateFieldChanges": self.__calculateEncapsulateFieldChanges, |
86 "CalculateLocalToAttributeChanges": self.__calculateLocalToAttributeChanges, |
105 "CalculateLocalToAttributeChanges": self.__calculateLocalToAttributeChanges, |
87 "CalculateMethodObjectChanges": self.__calculateMethodObjectChanges, |
106 "CalculateMethodObjectChanges": self.__calculateMethodObjectChanges, |
88 } |
107 } |
89 |
108 |
90 from FileSystemCommands import RefactoringClientFileSystemCommands |
|
91 |
|
92 self.__fsCommands = RefactoringClientFileSystemCommands(self) |
109 self.__fsCommands = RefactoringClientFileSystemCommands(self) |
93 |
110 |
94 self.__projectpath = projectPath |
111 self.__projectpath = projectPath |
95 self.__project = rope.base.project.Project( |
112 self.__project = rope.base.project.Project( |
96 self.__projectpath, fscommands=self.__fsCommands |
113 self.__projectpath, fscommands=self.__fsCommands |
119 @param err rope exception object |
136 @param err rope exception object |
120 @type Exception |
137 @type Exception |
121 @return dictionary containing the error information |
138 @return dictionary containing the error information |
122 @rtype dict |
139 @rtype dict |
123 """ |
140 """ |
124 import traceback |
|
125 |
|
126 tb = traceback.format_tb(sys.exc_info()[2]) |
141 tb = traceback.format_tb(sys.exc_info()[2]) |
127 ropeError = str(type(err)).split()[-1] |
142 ropeError = str(type(err)).split()[-1] |
128 ropeError = ropeError[1:-2].split(".")[-1] |
143 ropeError = ropeError[1:-2].split(".")[-1] |
129 errorDict = { |
144 errorDict = { |
130 "Error": ropeError, |
145 "Error": ropeError, |
135 errorDict["ErrorFile"] = err.filename |
150 errorDict["ErrorFile"] = err.filename |
136 errorDict["ErrorLine"] = err.lineno |
151 errorDict["ErrorLine"] = err.lineno |
137 |
152 |
138 return errorDict |
153 return errorDict |
139 |
154 |
140 def __abortAction(self, params): |
155 def __abortAction(self, params): # noqa: U100 |
141 """ |
156 """ |
142 Private method to abort the current action. |
157 Private method to abort the current action. |
143 |
158 |
144 @param params dictionary containing the method parameters sent by |
159 @param params dictionary containing the method parameters sent by |
145 the server |
160 the server |
146 @type dict |
161 @type dict |
147 """ |
162 """ |
148 if self.__progressHandle is not None and not self.__progressHandle.is_stopped(): |
163 if self.__progressHandle is not None and not self.__progressHandle.is_stopped(): |
149 self.__progressHandle.stop() |
164 self.__progressHandle.stop() |
150 |
165 |
151 def __validate(self, params): |
166 def __validate(self, params): # noqa: U100 |
152 """ |
167 """ |
153 Private slot to validate the project. |
168 Private slot to validate the project. |
154 |
169 |
155 @param params dictionary containing the method parameters sent by |
170 @param params dictionary containing the method parameters sent by |
156 the server |
171 the server |
157 @type dict |
172 @type dict |
158 """ |
173 """ |
159 self.__project.validate(self.__project.root) |
174 self.__project.validate(self.__project.root) |
160 |
175 |
161 def __closeProject(self, params): |
176 def __closeProject(self, params): # noqa: U100 |
162 """ |
177 """ |
163 Private slot to validate the project. |
178 Private slot to validate the project. |
164 |
179 |
165 @param params dictionary containing the method parameters sent by |
180 @param params dictionary containing the method parameters sent by |
166 the server |
181 the server |
167 @type dict |
182 @type dict |
168 """ |
183 """ |
169 self.__project.close() |
184 self.__project.close() |
170 |
185 |
171 def __getConfig(self, params): |
186 def __getConfig(self, params): # noqa: U100 |
172 """ |
187 """ |
173 Private method to send some configuration data to the server. |
188 Private method to send some configuration data to the server. |
174 |
189 |
175 @param params dictionary containing the method parameters sent by |
190 @param params dictionary containing the method parameters sent by |
176 the server |
191 the server |
200 ) as f: |
215 ) as f: |
201 result["DefaultConfig"] = f.read() |
216 result["DefaultConfig"] = f.read() |
202 |
217 |
203 self.sendJson("Config", result) |
218 self.sendJson("Config", result) |
204 |
219 |
205 def __configChanged(self, params): |
220 def __configChanged(self, params): # noqa: U100 |
206 """ |
221 """ |
207 Private method to handle a change of the configuration file. |
222 Private method to handle a change of the configuration file. |
208 |
223 |
209 @param params dictionary containing the method parameters sent by |
224 @param params dictionary containing the method parameters sent by |
210 the server |
225 the server |
227 filename = params["FileName"] |
242 filename = params["FileName"] |
228 offset = params["Offset"] |
243 offset = params["Offset"] |
229 |
244 |
230 errorDict = {} |
245 errorDict = {} |
231 occurrences = [] |
246 occurrences = [] |
232 |
|
233 import rope.contrib.findit |
|
234 |
247 |
235 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
248 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
236 self.__progressHandle = ProgressHandle(self, title, True) |
249 self.__progressHandle = ProgressHandle(self, title, True) |
237 try: |
250 try: |
238 occurrences = rope.contrib.findit.find_occurrences( |
251 occurrences = rope.contrib.findit.find_occurrences( |
274 source = params["Source"] |
287 source = params["Source"] |
275 |
288 |
276 errorDict = {} |
289 errorDict = {} |
277 location = None |
290 location = None |
278 |
291 |
279 import rope.contrib.findit |
|
280 |
|
281 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
292 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
282 try: |
293 try: |
283 location = rope.contrib.findit.find_definition( |
294 location = rope.contrib.findit.find_definition( |
284 self.__project, source, offset, resource |
295 self.__project, source, offset, resource |
285 ) |
296 ) |
307 filename = params["FileName"] |
318 filename = params["FileName"] |
308 offset = params["Offset"] |
319 offset = params["Offset"] |
309 |
320 |
310 errorDict = {} |
321 errorDict = {} |
311 occurrences = [] |
322 occurrences = [] |
312 |
|
313 import rope.contrib.findit |
|
314 |
323 |
315 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
324 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
316 self.__progressHandle = ProgressHandle(self, title, True) |
325 self.__progressHandle = ProgressHandle(self, title, True) |
317 try: |
326 try: |
318 occurrences = rope.contrib.findit.find_implementations( |
327 occurrences = rope.contrib.findit.find_implementations( |
557 result = { |
566 result = { |
558 "ChangeGroup": changeGroup, |
567 "ChangeGroup": changeGroup, |
559 "Title": title, |
568 "Title": title, |
560 } |
569 } |
561 |
570 |
562 import rope.refactor.rename |
|
563 |
|
564 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
571 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
565 |
572 |
566 resources = [resource] if isLocal else None |
573 resources = [resource] if isLocal else None |
567 |
574 |
568 self.__progressHandle = ProgressHandle(self, title, True) |
575 self.__progressHandle = ProgressHandle(self, title, True) |
640 result = { |
647 result = { |
641 "ChangeGroup": changeGroup, |
648 "ChangeGroup": changeGroup, |
642 "Title": title, |
649 "Title": title, |
643 } |
650 } |
644 |
651 |
645 import rope.refactor.rename |
|
646 |
|
647 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
652 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
648 try: |
653 try: |
649 renamer = rope.refactor.rename.ChangeOccurrences( |
654 renamer = rope.refactor.rename.ChangeOccurrences( |
650 self.__project, resource, offset |
655 self.__project, resource, offset |
651 ) |
656 ) |
686 changes = None |
691 changes = None |
687 result = { |
692 result = { |
688 "ChangeGroup": changeGroup, |
693 "ChangeGroup": changeGroup, |
689 "Title": title, |
694 "Title": title, |
690 } |
695 } |
691 |
|
692 import rope.refactor.extract |
|
693 |
696 |
694 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
697 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
695 try: |
698 try: |
696 if kind not in ("variable", "method"): |
699 if kind not in ("variable", "method"): |
697 raise Exception("Invalid extraction kind <{0}>.".format(kind)) |
700 raise Exception("Invalid extraction kind <{0}>.".format(kind)) |
733 "Subcommand": "InlineType", |
736 "Subcommand": "InlineType", |
734 "ChangeGroup": changeGroup, |
737 "ChangeGroup": changeGroup, |
735 "Title": title, |
738 "Title": title, |
736 } |
739 } |
737 |
740 |
738 import rope.refactor.inline |
|
739 |
|
740 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
741 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
741 try: |
742 try: |
742 inliner = rope.refactor.inline.create_inline( |
743 inliner = rope.refactor.inline.create_inline( |
743 self.__project, resource, offset |
744 self.__project, resource, offset |
744 ) |
745 ) |
774 changes = None |
775 changes = None |
775 result = { |
776 result = { |
776 "ChangeGroup": changeGroup, |
777 "ChangeGroup": changeGroup, |
777 "Title": title, |
778 "Title": title, |
778 } |
779 } |
779 |
|
780 import rope.refactor.extract |
|
781 |
780 |
782 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
781 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
783 self.__progressHandle = ProgressHandle(self, title, True) |
782 self.__progressHandle = ProgressHandle(self, title, True) |
784 try: |
783 try: |
785 inliner = rope.refactor.inline.create_inline( |
784 inliner = rope.refactor.inline.create_inline( |
826 result = { |
825 result = { |
827 "Subcommand": "MoveType", |
826 "Subcommand": "MoveType", |
828 "ChangeGroup": changeGroup, |
827 "ChangeGroup": changeGroup, |
829 "Title": title, |
828 "Title": title, |
830 } |
829 } |
831 |
|
832 import rope.refactor.move |
|
833 |
830 |
834 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
831 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
835 try: |
832 try: |
836 mover = rope.refactor.move.create_move(self.__project, resource, offset) |
833 mover = rope.refactor.move.create_move(self.__project, resource, offset) |
837 if isinstance(mover, rope.refactor.move.MoveGlobal): |
834 if isinstance(mover, rope.refactor.move.MoveGlobal): |
877 changes = None |
874 changes = None |
878 result = { |
875 result = { |
879 "ChangeGroup": changeGroup, |
876 "ChangeGroup": changeGroup, |
880 "Title": title, |
877 "Title": title, |
881 } |
878 } |
882 |
|
883 import rope.refactor.move |
|
884 |
879 |
885 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
880 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
886 self.__progressHandle = ProgressHandle(self, title, True) |
881 self.__progressHandle = ProgressHandle(self, title, True) |
887 try: |
882 try: |
888 mover = rope.refactor.move.create_move(self.__project, resource, offset) |
883 mover = rope.refactor.move.create_move(self.__project, resource, offset) |
932 "Subcommand": "UseFunctionName", |
927 "Subcommand": "UseFunctionName", |
933 "ChangeGroup": changeGroup, |
928 "ChangeGroup": changeGroup, |
934 "Title": title, |
929 "Title": title, |
935 } |
930 } |
936 |
931 |
937 import rope.refactor.usefunction |
|
938 |
|
939 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
932 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
940 try: |
933 try: |
941 user = rope.refactor.usefunction.UseFunction( |
934 user = rope.refactor.usefunction.UseFunction( |
942 self.__project, resource, offset |
935 self.__project, resource, offset |
943 ) |
936 ) |
968 result = { |
961 result = { |
969 "ChangeGroup": changeGroup, |
962 "ChangeGroup": changeGroup, |
970 "Title": title, |
963 "Title": title, |
971 } |
964 } |
972 |
965 |
973 import rope.refactor.usefunction |
|
974 |
|
975 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
966 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
976 self.__progressHandle = ProgressHandle(self, title, True) |
967 self.__progressHandle = ProgressHandle(self, title, True) |
977 try: |
968 try: |
978 user = rope.refactor.usefunction.UseFunction( |
969 user = rope.refactor.usefunction.UseFunction( |
979 self.__project, resource, offset |
970 self.__project, resource, offset |
1011 changes = None |
1002 changes = None |
1012 result = { |
1003 result = { |
1013 "ChangeGroup": changeGroup, |
1004 "ChangeGroup": changeGroup, |
1014 "Title": title, |
1005 "Title": title, |
1015 } |
1006 } |
1016 |
|
1017 import rope.refactor.introduce_factory |
|
1018 |
1007 |
1019 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1008 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1020 self.__progressHandle = ProgressHandle(self, title, True) |
1009 self.__progressHandle = ProgressHandle(self, title, True) |
1021 try: |
1010 try: |
1022 introducer = rope.refactor.introduce_factory.IntroduceFactoryRefactoring( |
1011 introducer = rope.refactor.introduce_factory.IntroduceFactoryRefactoring( |
1059 result = { |
1048 result = { |
1060 "ChangeGroup": changeGroup, |
1049 "ChangeGroup": changeGroup, |
1061 "Title": title, |
1050 "Title": title, |
1062 } |
1051 } |
1063 |
1052 |
1064 import rope.refactor.introduce_parameter |
|
1065 |
|
1066 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1053 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1067 try: |
1054 try: |
1068 introducer = rope.refactor.introduce_parameter.IntroduceParameter( |
1055 introducer = rope.refactor.introduce_parameter.IntroduceParameter( |
1069 self.__project, resource, offset |
1056 self.__project, resource, offset |
1070 ) |
1057 ) |
1098 changes = None |
1085 changes = None |
1099 result = { |
1086 result = { |
1100 "ChangeGroup": changeGroup, |
1087 "ChangeGroup": changeGroup, |
1101 "Title": title, |
1088 "Title": title, |
1102 } |
1089 } |
1103 |
|
1104 from rope.refactor.importutils import ImportOrganizer |
|
1105 |
1090 |
1106 method = { |
1091 method = { |
1107 "organize_imports": ImportOrganizer.organize_imports, |
1092 "organize_imports": ImportOrganizer.organize_imports, |
1108 "expand_star_imports": ImportOrganizer.expand_star_imports, |
1093 "expand_star_imports": ImportOrganizer.expand_star_imports, |
1109 "relatives_to_absolutes": ImportOrganizer.relatives_to_absolutes, |
1094 "relatives_to_absolutes": ImportOrganizer.relatives_to_absolutes, |
1157 result = { |
1142 result = { |
1158 "ChangeGroup": changeGroup, |
1143 "ChangeGroup": changeGroup, |
1159 "Title": title, |
1144 "Title": title, |
1160 } |
1145 } |
1161 |
1146 |
1162 import rope.refactor.restructure |
|
1163 |
|
1164 self.__project.validate(self.__project.root) |
1147 self.__project.validate(self.__project.root) |
1165 self.__progressHandle = ProgressHandle(self, title, True) |
1148 self.__progressHandle = ProgressHandle(self, title, True) |
1166 try: |
1149 try: |
1167 restructuring = rope.refactor.restructure.Restructure( |
1150 restructuring = rope.refactor.restructure.Restructure( |
1168 self.__project, pattern, goal, args=args, imports=imports |
1151 self.__project, pattern, goal, args=args, imports=imports |
1198 result = { |
1181 result = { |
1199 "Subcommand": "Signature", |
1182 "Subcommand": "Signature", |
1200 "ChangeGroup": changeGroup, |
1183 "ChangeGroup": changeGroup, |
1201 "Title": title, |
1184 "Title": title, |
1202 } |
1185 } |
1203 |
|
1204 import rope.refactor.change_signature |
|
1205 |
1186 |
1206 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1187 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1207 try: |
1188 try: |
1208 changer = rope.refactor.change_signature.ChangeSignature( |
1189 changer = rope.refactor.change_signature.ChangeSignature( |
1209 self.__project, resource, offset |
1190 self.__project, resource, offset |
1344 changes = None |
1324 changes = None |
1345 result = { |
1325 result = { |
1346 "ChangeGroup": changeGroup, |
1326 "ChangeGroup": changeGroup, |
1347 "Title": title, |
1327 "Title": title, |
1348 } |
1328 } |
1349 |
|
1350 import rope.refactor.topackage |
|
1351 |
1329 |
1352 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1330 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1353 try: |
1331 try: |
1354 changes = rope.refactor.topackage.ModuleToPackage( |
1332 changes = rope.refactor.topackage.ModuleToPackage( |
1355 self.__project, resource |
1333 self.__project, resource |
1395 "Subcommand": "FieldName", |
1373 "Subcommand": "FieldName", |
1396 "ChangeGroup": changeGroup, |
1374 "ChangeGroup": changeGroup, |
1397 "Title": title, |
1375 "Title": title, |
1398 } |
1376 } |
1399 |
1377 |
1400 import rope.refactor.encapsulate_field |
|
1401 |
|
1402 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1378 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1403 try: |
1379 try: |
1404 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( |
1380 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( |
1405 self.__project, resource, offset |
1381 self.__project, resource, offset |
1406 ) |
1382 ) |
1433 result = { |
1409 result = { |
1434 "ChangeGroup": changeGroup, |
1410 "ChangeGroup": changeGroup, |
1435 "Title": title, |
1411 "Title": title, |
1436 } |
1412 } |
1437 |
1413 |
1438 import rope.refactor.encapsulate_field |
|
1439 |
|
1440 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1414 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1441 self.__progressHandle = ProgressHandle(self, title, True) |
1415 self.__progressHandle = ProgressHandle(self, title, True) |
1442 try: |
1416 try: |
1443 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( |
1417 encapsulateField = rope.refactor.encapsulate_field.EncapsulateField( |
1444 self.__project, resource, offset |
1418 self.__project, resource, offset |
1476 changes = None |
1450 changes = None |
1477 result = { |
1451 result = { |
1478 "ChangeGroup": changeGroup, |
1452 "ChangeGroup": changeGroup, |
1479 "Title": title, |
1453 "Title": title, |
1480 } |
1454 } |
1481 |
|
1482 import rope.refactor.localtofield |
|
1483 |
1455 |
1484 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1456 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1485 try: |
1457 try: |
1486 changes = rope.refactor.localtofield.LocalToField( |
1458 changes = rope.refactor.localtofield.LocalToField( |
1487 self.__project, resource, offset |
1459 self.__project, resource, offset |
1528 result = { |
1500 result = { |
1529 "ChangeGroup": changeGroup, |
1501 "ChangeGroup": changeGroup, |
1530 "Title": title, |
1502 "Title": title, |
1531 } |
1503 } |
1532 |
1504 |
1533 import rope.refactor.method_object |
|
1534 |
|
1535 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1505 resource = rope.base.libutils.path_to_resource(self.__project, filename) |
1536 try: |
1506 try: |
1537 converter = rope.refactor.method_object.MethodObject( |
1507 converter = rope.refactor.method_object.MethodObject( |
1538 self.__project, resource, offset |
1508 self.__project, resource, offset |
1539 ) |
1509 ) |
1549 self.sendJson("Changes", result) |
1519 self.sendJson("Changes", result) |
1550 |
1520 |
1551 |
1521 |
1552 if __name__ == "__main__": |
1522 if __name__ == "__main__": |
1553 if len(sys.argv) != 5: |
1523 if len(sys.argv) != 5: |
1554 print( |
1524 print("Host, port, project path and module path parameters are missing. Abort.") |
1555 "Host, port, project path and module path parameters are" " missing. Abort." |
|
1556 ) |
|
1557 sys.exit(1) |
1525 sys.exit(1) |
1558 |
1526 |
1559 host, port, projectPath = sys.argv[1:-1] |
1527 host, port, projectPath = sys.argv[1:-1] |
1560 |
1528 |
1561 # Create a Qt6 application object in order to allow the processing of |
1529 # Create a Qt6 application object in order to allow the processing of |