src/eric7/JediInterface/AssistantJedi.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8949
bab82fd15a6b
child 9214
bd28e56047d7
equal deleted inserted replaced
9208:3fc8dfeb6ebe 9209:b99e7fd55fd3
1 # -*- coding: utf-8 -*-
2
3 # Copyright (c) 2015 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
4 #
5
6 """
7 Module implementing the Jedi assistant plug-in.
8 """
9
10 import contextlib
11
12 from PyQt6.QtCore import pyqtSlot, QObject
13 from PyQt6.QtWidgets import QMenu
14
15 import Preferences
16
17
18 class AssistantJedi(QObject):
19 """
20 Class implementing the Jedi assistant interface.
21 """
22 def __init__(self, ui, viewManager, project):
23 """
24 Constructor
25
26 @param ui reference to the user interface object
27 @type UserInterface
28 @param viewManager reference to the viewmanager object
29 @type ViewManager
30 @param project reference to the project object
31 @type Project
32 """
33 super().__init__(ui)
34 self.__ui = ui
35 self.__vm = viewManager
36
37 self.__jediServer = None
38 self.__editors = []
39 self.__menuActions = {}
40
41 from .JediServer import JediServer
42 self.__jediServer = JediServer(self.__vm, project, self.__ui)
43 self.__jediServer.activate()
44
45 self.__ui.preferencesChanged.connect(self.__preferencesChanged)
46
47 self.__initRefactoringMenu()
48
49 self.__vm.editorOpenedEd.connect(self.__editorOpened)
50 self.__vm.editorClosedEd.connect(self.__editorClosed)
51
52 @pyqtSlot()
53 def __preferencesChanged(self):
54 """
55 Private slot handling changes of the Disassembly viewer settings.
56 """
57 for editor in self.__editors:
58 self.__disconnectMouseClickHandler(editor)
59 self.__connectMouseClickHandler(editor)
60
61 def __determineLanguage(self):
62 """
63 Private method to determine the valid language strings.
64
65 @return list of valid language strings
66 @rtype list of str
67 """
68 return ["Python3", "MicroPython",
69 "Pygments|Python", "Pygments|Python 2.x",
70 "Cython"]
71
72 def __editorOpened(self, editor):
73 """
74 Private slot called, when a new editor was opened.
75
76 @param editor reference to the new editor
77 @type Editor
78 """
79 languages = self.__determineLanguage()
80
81 if editor.getLanguage() in languages:
82 self.__connectEditor(editor)
83
84 editor.languageChanged.connect(self.__editorLanguageChanged)
85 self.__editors.append(editor)
86
87 def __editorClosed(self, editor):
88 """
89 Private slot called, when an editor was closed.
90
91 @param editor reference to the editor
92 @type Editor
93 """
94 if editor in self.__editors:
95 editor.languageChanged.disconnect(self.__editorLanguageChanged)
96 self.__disconnectEditor(editor)
97 self.__editors.remove(editor)
98
99 def __editorLanguageChanged(self, language):
100 """
101 Private slot to handle the language change of an editor.
102
103 @param language programming language of the editor
104 @type str
105 """
106 editor = self.sender()
107 languages = self.__determineLanguage()
108
109 self.__disconnectEditor(editor)
110 if language in languages:
111 self.__connectEditor(editor)
112
113 def __connectEditor(self, editor):
114 """
115 Private method to connect an editor.
116
117 @param editor reference to the editor
118 @type Editor
119 """
120 self.__setAutoCompletionHook(editor)
121 self.__setCalltipsHook(editor)
122
123 self.__connectMouseClickHandler(editor)
124
125 editor.registerMouseHoverHelpFunction(
126 self.__jediServer.hoverHelp)
127
128 menu = editor.getMenu("Main")
129 if menu is not None:
130 checkAction = editor.getMenu("Checks").menuAction()
131 act = menu.insertMenu(checkAction, self.__menu)
132 sep = menu.insertSeparator(checkAction)
133 self.__menuActions[editor] = [act, sep]
134 editor.showMenu.connect(self.__editorShowMenu)
135
136 def __disconnectEditor(self, editor):
137 """
138 Private method to disconnect an editor.
139
140 @param editor reference to the editor
141 @type Editor
142 """
143 self.__unsetAutoCompletionHook(editor)
144 self.__unsetCalltipsHook(editor)
145
146 self.__disconnectMouseClickHandler(editor)
147
148 editor.unregisterMouseHoverHelpFunction(
149 self.__jediServer.hoverHelp)
150
151 with contextlib.suppress(TypeError):
152 editor.showMenu.disconnect(self.__editorShowMenu)
153 menu = editor.getMenu("Main")
154 if menu is not None and editor in self.__menuActions:
155 for act in self.__menuActions[editor]:
156 with contextlib.suppress(RuntimeError):
157 menu.removeAction(act)
158 del self.__menuActions[editor]
159
160 def __connectMouseClickHandler(self, editor):
161 """
162 Private method to connect the mouse click handler to an editor.
163
164 @param editor reference to the editor
165 @type Editor
166 """
167 if Preferences.getJedi("MouseClickGotoButton"):
168 editor.setMouseClickHandler(
169 "jedi",
170 Preferences.getJedi("MouseClickGotoModifiers"),
171 Preferences.getJedi("MouseClickGotoButton"),
172 self.__jediServer.gotoDefinition
173 )
174
175 def __disconnectMouseClickHandler(self, editor):
176 """
177 Private method to disconnect the mouse click handler from an editor.
178
179 @param editor reference to the editor
180 @type Editor
181 """
182 editor.removeMouseClickHandlers("jedi")
183
184 def __setAutoCompletionHook(self, editor):
185 """
186 Private method to set the autocompletion hook.
187
188 @param editor reference to the editor
189 @type Editor
190 """
191 editor.addCompletionListHook(
192 "jedi", self.__jediServer.requestCompletions, True)
193
194 def __unsetAutoCompletionHook(self, editor):
195 """
196 Private method to unset the autocompletion hook.
197
198 @param editor reference to the editor
199 @type Editor
200 """
201 editor.removeCompletionListHook("jedi")
202
203 def __setCalltipsHook(self, editor):
204 """
205 Private method to set the calltip hook.
206
207 @param editor reference to the editor
208 @type Editor
209 """
210 editor.addCallTipHook("jedi", self.__jediServer.getCallTips)
211
212 def __unsetCalltipsHook(self, editor):
213 """
214 Private method to unset the calltip hook.
215
216 @param editor reference to the editor
217 @type Editor
218 """
219 editor.removeCallTipHook("jedi")
220
221 def __initRefactoringMenu(self):
222 """
223 Private method to initialize the Refactoring menu.
224 """
225 self.__menu = QMenu(self.tr("Refactoring"))
226 self.__menu.addAction(
227 self.tr("Rename Variable"),
228 self.__jediServer.refactoringRenameVariable)
229 self.__menu.addAction(
230 self.tr("Extract Variable"),
231 self.__jediServer.refactoringExtractNewVariable)
232 self.__menu.addAction(
233 self.tr("Inline Variable"),
234 self.__jediServer.refactoringInlineVariable)
235 self.__menu.addSeparator()
236 self.__menu.addAction(
237 self.tr("Extract Function"),
238 self.__jediServer.refactoringExtractFunction)
239
240 def __editorShowMenu(self, menuName, menu, editor):
241 """
242 Private slot called, when the the editor context menu or a submenu is
243 about to be shown.
244
245 @param menuName name of the menu to be shown
246 @type str
247 @param menu reference to the menu
248 @type QMenu
249 @param editor reference to the editor
250 @type Editor
251 """
252 if menuName == "Main":
253 self.__menu.setEnabled(editor.hasSelectedText())

eric ide

mercurial