Mercurial > hg > dotemacs
annotate elpa/elpy-1.14.1/elpy/jedibackend.py @ 156:c745e2cc79ee
elpy: update along with direct deps
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 27 Feb 2017 12:17:38 -0500 |
parents | elpa/elpy-1.12.0/elpy/jedibackend.py@55ceabc58fcc |
children |
rev | line source |
---|---|
98 | 1 """Elpy backend using the Jedi library. |
2 | |
3 This backend uses the Jedi library: | |
4 | |
5 https://github.com/davidhalter/jedi | |
6 | |
7 """ | |
8 | |
9 import sys | |
10 import traceback | |
11 | |
12 import jedi | |
13 | |
14 from elpy import rpc | |
15 | |
16 | |
17 class JediBackend(object): | |
18 """The Jedi backend class. | |
19 | |
20 Implements the RPC calls we can pass on to Jedi. | |
21 | |
22 Documentation: http://jedi.jedidjah.ch/en/latest/docs/plugin-api.html | |
23 | |
24 """ | |
25 name = "jedi" | |
26 | |
27 def __init__(self, project_root): | |
28 self.project_root = project_root | |
29 self.completions = {} | |
30 sys.path.append(project_root) | |
31 | |
32 def rpc_get_completions(self, filename, source, offset): | |
33 line, column = pos_to_linecol(source, offset) | |
34 proposals = run_with_debug(jedi, 'completions', | |
35 source=source, line=line, column=column, | |
36 path=filename, encoding='utf-8') | |
37 if proposals is None: | |
38 return [] | |
39 self.completions = dict((proposal.name, proposal) | |
40 for proposal in proposals) | |
152
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
41 return [{'name': proposal.name.rstrip("="), |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
42 'suffix': proposal.complete.rstrip("="), |
98 | 43 'annotation': proposal.type, |
44 'meta': proposal.description} | |
45 for proposal in proposals] | |
46 | |
47 def rpc_get_completion_docstring(self, completion): | |
48 proposal = self.completions.get(completion) | |
49 if proposal is None: | |
50 return None | |
51 else: | |
52 return proposal.docstring(fast=False) | |
53 | |
54 def rpc_get_completion_location(self, completion): | |
55 proposal = self.completions.get(completion) | |
56 if proposal is None: | |
57 return None | |
58 else: | |
59 return (proposal.module_path, proposal.line) | |
60 | |
126
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
61 def rpc_get_docstring(self, filename, source, offset): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
62 line, column = pos_to_linecol(source, offset) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
63 try: |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
64 locations = run_with_debug(jedi, 'goto_definitions', |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
65 source=source, line=line, column=column, |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
66 path=filename, encoding='utf-8', |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
67 re_raise=jedi.NotFoundError) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
68 except jedi.NotFoundError: |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
69 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
70 if locations: |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
71 return ('Documentation for {0}:\n\n'.format( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
72 locations[-1].full_name) + locations[-1].docstring()) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
73 else: |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
74 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
75 |
98 | 76 def rpc_get_definition(self, filename, source, offset): |
77 line, column = pos_to_linecol(source, offset) | |
78 try: | |
79 locations = run_with_debug(jedi, 'goto_definitions', | |
80 source=source, line=line, column=column, | |
81 path=filename, encoding='utf-8', | |
82 re_raise=jedi.NotFoundError) | |
83 except jedi.NotFoundError: | |
84 return None | |
85 # goto_definitions() can return silly stuff like __builtin__ | |
86 # for int variables, so we fall back on goto() in those | |
87 # cases. See issue #76. | |
88 if ( | |
89 locations and | |
90 locations[0].module_path is None | |
91 ): | |
92 locations = run_with_debug(jedi, 'goto_assignments', | |
93 source=source, line=line, | |
94 column=column, | |
95 path=filename, encoding='utf-8') | |
96 if not locations: | |
97 return None | |
98 else: | |
99 loc = locations[-1] | |
100 try: | |
101 if loc.module_path: | |
102 if loc.module_path == filename: | |
103 offset = linecol_to_pos(source, | |
104 loc.line, | |
105 loc.column) | |
106 else: | |
107 with open(loc.module_path) as f: | |
108 offset = linecol_to_pos(f.read(), | |
109 loc.line, | |
110 loc.column) | |
126
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
111 else: |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
112 return None |
98 | 113 except IOError: |
114 return None | |
115 return (loc.module_path, offset) | |
116 | |
117 def rpc_get_calltip(self, filename, source, offset): | |
118 line, column = pos_to_linecol(source, offset) | |
119 calls = run_with_debug(jedi, 'call_signatures', | |
120 source=source, line=line, column=column, | |
121 path=filename, encoding='utf-8') | |
122 if calls: | |
123 call = calls[0] | |
124 else: | |
125 call = None | |
126 if not call: | |
127 return None | |
152
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
128 try: |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
129 call.index |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
130 except AttributeError as e: |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
131 if "get_definition" in str(e): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
132 # Bug #627 / jedi#573 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
133 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
134 elif "get_subscope_by_name" in str(e): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
135 # Bug #677 / jedi#628 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
136 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
137 else: |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
138 raise |
98 | 139 return {"name": call.name, |
140 "index": call.index, | |
141 "params": [param.description for param in call.params]} | |
142 | |
143 def rpc_get_usages(self, filename, source, offset): | |
144 """Return the uses of the symbol at offset. | |
145 | |
146 Returns a list of occurrences of the symbol, as dicts with the | |
147 fields name, filename, and offset. | |
148 | |
149 """ | |
150 line, column = pos_to_linecol(source, offset) | |
151 try: | |
152 uses = run_with_debug(jedi, 'usages', | |
153 source=source, line=line, column=column, | |
154 path=filename, encoding='utf-8', | |
155 re_raise=(jedi.NotFoundError,)) | |
156 except jedi.NotFoundError: | |
157 return [] | |
158 | |
159 if uses is None: | |
160 return None | |
161 result = [] | |
162 for use in uses: | |
163 if use.module_path == filename: | |
164 offset = linecol_to_pos(source, use.line, use.column) | |
126
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
165 elif use.module_path is not None: |
98 | 166 with open(use.module_path) as f: |
167 text = f.read() | |
168 offset = linecol_to_pos(text, use.line, use.column) | |
169 | |
170 result.append({"name": use.name, | |
171 "filename": use.module_path, | |
172 "offset": offset}) | |
173 | |
174 return result | |
175 | |
176 | |
177 # From the Jedi documentation: | |
178 # | |
179 # line is the current line you want to perform actions on (starting | |
180 # with line #1 as the first line). column represents the current | |
181 # column/indent of the cursor (starting with zero). source_path | |
182 # should be the path of your file in the file system. | |
183 | |
184 def pos_to_linecol(text, pos): | |
185 """Return a tuple of line and column for offset pos in text. | |
186 | |
187 Lines are one-based, columns zero-based. | |
188 | |
189 This is how Jedi wants it. Don't ask me why. | |
190 | |
191 """ | |
192 line_start = text.rfind("\n", 0, pos) + 1 | |
193 line = text.count("\n", 0, line_start) + 1 | |
194 col = pos - line_start | |
195 return line, col | |
196 | |
197 | |
198 def linecol_to_pos(text, line, col): | |
199 """Return the offset of this line and column in text. | |
200 | |
201 Lines are one-based, columns zero-based. | |
202 | |
203 This is how Jedi wants it. Don't ask me why. | |
204 | |
205 """ | |
206 nth_newline_offset = 0 | |
207 for i in range(line - 1): | |
208 new_offset = text.find("\n", nth_newline_offset) | |
209 if new_offset < 0: | |
210 raise ValueError("Text does not have {0} lines." | |
211 .format(line)) | |
212 nth_newline_offset = new_offset + 1 | |
213 offset = nth_newline_offset + col | |
214 if offset > len(text): | |
215 raise ValueError("Line {0} column {1} is not within the text" | |
216 .format(line, col)) | |
217 return offset | |
218 | |
219 | |
220 def run_with_debug(jedi, name, *args, **kwargs): | |
221 re_raise = kwargs.pop('re_raise', ()) | |
222 # Remove form feed characters, they confuse Jedi (jedi#424) | |
223 if 'source' in kwargs: | |
224 kwargs['source'] = kwargs['source'].replace("\f", " ") | |
225 try: | |
226 script = jedi.Script(*args, **kwargs) | |
227 return getattr(script, name)() | |
228 except Exception as e: | |
229 if isinstance(e, re_raise): | |
230 raise | |
231 # Bug jedi#417 | |
232 if isinstance(e, TypeError) and str(e) == 'no dicts allowed': | |
233 return None | |
234 # Bug jedi#427 | |
235 if isinstance(e, UnicodeDecodeError): | |
236 return None | |
237 # Bug jedi#429 | |
238 if isinstance(e, IndexError): | |
239 return None | |
240 # Bug jedi#431 | |
241 if isinstance(e, AttributeError) and str(e).endswith("'end_pos'"): | |
242 return None | |
243 # Bug in Python 2.6, see #275 | |
244 if isinstance(e, OSError) and e.errno == 13: | |
245 return None | |
126
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
246 # Bug jedi#466 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
247 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
248 isinstance(e, SyntaxError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
249 "EOL while scanning string literal" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
250 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
251 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
252 # Bug jedi#482 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
253 if isinstance(e, UnicodeEncodeError): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
254 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
255 # Bug jedi#485 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
256 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
257 isinstance(e, ValueError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
258 "invalid \\x escape" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
259 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
260 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
261 # Bug jedi#485 in Python 3 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
262 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
263 isinstance(e, SyntaxError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
264 "truncated \\xXX escape" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
265 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
266 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
267 # Bug jedi#465 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
268 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
269 isinstance(e, SyntaxError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
270 "encoding declaration in Unicode string" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
271 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
272 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
273 # Bug #337 / jedi#471 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
274 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
275 isinstance(e, ImportError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
276 "No module named" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
277 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
278 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
279 # Bug #365 / jedi#486 - fixed in Jedi 0.8.2 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
280 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
281 isinstance(e, UnboundLocalError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
282 "local variable 'path' referenced before assignment" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
283 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
284 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
285 # Bug #366 / jedi#491 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
286 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
287 isinstance(e, ValueError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
288 "__loader__ is None" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
289 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
290 return None |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
291 # Bug #353 |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
292 if ( |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
293 isinstance(e, OSError) and |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
294 "No such file or directory" in str(e) |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
295 ): |
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
296 return None |
152
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
297 # Bug #561, #564, #570, #588, #593, #599 / jedi#572, jedi#579, jedi#590 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
298 if isinstance(e, KeyError): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
299 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
300 # Bug #519 / jedi#610 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
301 if ( |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
302 isinstance(e, RuntimeError) and |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
303 "maximum recursion depth exceeded" in str(e) |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
304 ): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
305 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
306 # Bug #563 / jedi#589 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
307 if ( |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
308 isinstance(e, AttributeError) and |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
309 "MergedNamesDict" in str(e) |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
310 ): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
311 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
312 # Bug #615 / jedi#592 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
313 if ( |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
314 isinstance(e, AttributeError) and |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
315 "ListComprehension" in str(e) |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
316 ): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
317 return None |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
318 # Bug #569 / jedi#593 |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
319 if ( |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
320 isinstance(e, AttributeError) and |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
321 "names_dict" in str(e) |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
322 ): |
55ceabc58fcc
elpy: upgrade to 1.12
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
126
diff
changeset
|
323 return None |
98 | 324 |
325 from jedi import debug | |
326 | |
327 debug_info = [] | |
328 | |
329 def _debug(level, str_out): | |
330 if level == debug.NOTICE: | |
331 prefix = "[N]" | |
332 elif level == debug.WARNING: | |
333 prefix = "[W]" | |
334 else: | |
335 prefix = "[?]" | |
126
29cff77e2387
update elpa packges
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
98
diff
changeset
|
336 debug_info.append(u"{0} {1}".format(prefix, str_out)) |
98 | 337 |
338 jedi.set_debug_function(_debug, speed=False) | |
339 try: | |
340 script = jedi.Script(*args, **kwargs) | |
341 return getattr(script, name)() | |
342 except Exception as e: | |
343 source = kwargs.get('source') | |
344 sc_args = [] | |
345 sc_args.extend(repr(arg) for arg in args) | |
346 sc_args.extend("{0}={1}".format(k, "source" if k == "source" | |
347 else repr(v)) | |
348 for (k, v) in kwargs.items()) | |
349 | |
350 data = { | |
351 "traceback": traceback.format_exc(), | |
352 "jedi_debug_info": {'script_args': ", ".join(sc_args), | |
353 'source': source, | |
354 'method': name, | |
355 'debug_info': debug_info} | |
356 } | |
357 raise rpc.Fault(message=str(e), | |
358 code=500, | |
359 data=data) | |
360 finally: | |
361 jedi.set_debug_function(None) |