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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
98
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
1 """Elpy backend using the Jedi library.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
2
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
3 This backend uses the Jedi library:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
4
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
5 https://github.com/davidhalter/jedi
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
6
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
7 """
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
8
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
9 import sys
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
10 import traceback
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
11
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
12 import jedi
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
13
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
14 from elpy import rpc
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
15
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
16
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
17 class JediBackend(object):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
18 """The Jedi backend class.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
19
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
20 Implements the RPC calls we can pass on to Jedi.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
21
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
22 Documentation: http://jedi.jedidjah.ch/en/latest/docs/plugin-api.html
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
23
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
24 """
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
25 name = "jedi"
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
26
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
27 def __init__(self, project_root):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
28 self.project_root = project_root
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
29 self.completions = {}
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
30 sys.path.append(project_root)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
31
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
32 def rpc_get_completions(self, filename, source, offset):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
33 line, column = pos_to_linecol(source, offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
34 proposals = run_with_debug(jedi, 'completions',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
35 source=source, line=line, column=column,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
36 path=filename, encoding='utf-8')
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
37 if proposals is None:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
38 return []
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
39 self.completions = dict((proposal.name, proposal)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
43 'annotation': proposal.type,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
44 'meta': proposal.description}
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
45 for proposal in proposals]
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
46
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
47 def rpc_get_completion_docstring(self, completion):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
48 proposal = self.completions.get(completion)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
49 if proposal is None:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
50 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
51 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
52 return proposal.docstring(fast=False)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
53
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
54 def rpc_get_completion_location(self, completion):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
55 proposal = self.completions.get(completion)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
56 if proposal is None:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
57 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
58 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
59 return (proposal.module_path, proposal.line)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
76 def rpc_get_definition(self, filename, source, offset):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
77 line, column = pos_to_linecol(source, offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
78 try:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
79 locations = run_with_debug(jedi, 'goto_definitions',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
80 source=source, line=line, column=column,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
81 path=filename, encoding='utf-8',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
82 re_raise=jedi.NotFoundError)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
83 except jedi.NotFoundError:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
84 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
85 # goto_definitions() can return silly stuff like __builtin__
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
86 # for int variables, so we fall back on goto() in those
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
87 # cases. See issue #76.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
88 if (
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
89 locations and
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
90 locations[0].module_path is None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
91 ):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
92 locations = run_with_debug(jedi, 'goto_assignments',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
93 source=source, line=line,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
94 column=column,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
95 path=filename, encoding='utf-8')
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
96 if not locations:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
97 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
98 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
99 loc = locations[-1]
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
100 try:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
101 if loc.module_path:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
102 if loc.module_path == filename:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
103 offset = linecol_to_pos(source,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
104 loc.line,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
105 loc.column)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
106 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
107 with open(loc.module_path) as f:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
108 offset = linecol_to_pos(f.read(),
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
109 loc.line,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
113 except IOError:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
114 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
115 return (loc.module_path, offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
116
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
117 def rpc_get_calltip(self, filename, source, offset):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
118 line, column = pos_to_linecol(source, offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
119 calls = run_with_debug(jedi, 'call_signatures',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
120 source=source, line=line, column=column,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
121 path=filename, encoding='utf-8')
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
122 if calls:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
123 call = calls[0]
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
124 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
125 call = None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
126 if not call:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
139 return {"name": call.name,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
140 "index": call.index,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
141 "params": [param.description for param in call.params]}
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
142
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
143 def rpc_get_usages(self, filename, source, offset):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
144 """Return the uses of the symbol at offset.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
145
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
146 Returns a list of occurrences of the symbol, as dicts with the
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
147 fields name, filename, and offset.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
148
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
149 """
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
150 line, column = pos_to_linecol(source, offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
151 try:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
152 uses = run_with_debug(jedi, 'usages',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
153 source=source, line=line, column=column,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
154 path=filename, encoding='utf-8',
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
155 re_raise=(jedi.NotFoundError,))
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
156 except jedi.NotFoundError:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
157 return []
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
158
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
159 if uses is None:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
160 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
161 result = []
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
162 for use in uses:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
163 if use.module_path == filename:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
166 with open(use.module_path) as f:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
167 text = f.read()
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
168 offset = linecol_to_pos(text, use.line, use.column)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
169
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
170 result.append({"name": use.name,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
171 "filename": use.module_path,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
172 "offset": offset})
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
173
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
174 return result
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
175
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
176
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
177 # From the Jedi documentation:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
178 #
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
179 # line is the current line you want to perform actions on (starting
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
180 # with line #1 as the first line). column represents the current
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
181 # column/indent of the cursor (starting with zero). source_path
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
182 # should be the path of your file in the file system.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
183
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
184 def pos_to_linecol(text, pos):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
185 """Return a tuple of line and column for offset pos in text.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
186
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
187 Lines are one-based, columns zero-based.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
188
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
189 This is how Jedi wants it. Don't ask me why.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
190
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
191 """
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
192 line_start = text.rfind("\n", 0, pos) + 1
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
193 line = text.count("\n", 0, line_start) + 1
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
194 col = pos - line_start
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
195 return line, col
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
196
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
197
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
198 def linecol_to_pos(text, line, col):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
199 """Return the offset of this line and column in text.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
200
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
201 Lines are one-based, columns zero-based.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
202
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
203 This is how Jedi wants it. Don't ask me why.
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
204
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
205 """
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
206 nth_newline_offset = 0
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
207 for i in range(line - 1):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
208 new_offset = text.find("\n", nth_newline_offset)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
209 if new_offset < 0:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
210 raise ValueError("Text does not have {0} lines."
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
211 .format(line))
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
212 nth_newline_offset = new_offset + 1
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
213 offset = nth_newline_offset + col
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
214 if offset > len(text):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
215 raise ValueError("Line {0} column {1} is not within the text"
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
216 .format(line, col))
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
217 return offset
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
218
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
219
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
220 def run_with_debug(jedi, name, *args, **kwargs):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
221 re_raise = kwargs.pop('re_raise', ())
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
222 # Remove form feed characters, they confuse Jedi (jedi#424)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
223 if 'source' in kwargs:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
224 kwargs['source'] = kwargs['source'].replace("\f", " ")
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
225 try:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
226 script = jedi.Script(*args, **kwargs)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
227 return getattr(script, name)()
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
228 except Exception as e:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
229 if isinstance(e, re_raise):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
230 raise
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
231 # Bug jedi#417
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
232 if isinstance(e, TypeError) and str(e) == 'no dicts allowed':
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
233 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
234 # Bug jedi#427
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
235 if isinstance(e, UnicodeDecodeError):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
236 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
237 # Bug jedi#429
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
238 if isinstance(e, IndexError):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
239 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
240 # Bug jedi#431
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
241 if isinstance(e, AttributeError) and str(e).endswith("'end_pos'"):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
242 return None
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
243 # Bug in Python 2.6, see #275
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
244 if isinstance(e, OSError) and e.errno == 13:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
324
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
325 from jedi import debug
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
326
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
327 debug_info = []
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
328
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
329 def _debug(level, str_out):
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
330 if level == debug.NOTICE:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
331 prefix = "[N]"
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
332 elif level == debug.WARNING:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
333 prefix = "[W]"
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
334 else:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
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
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
337
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
338 jedi.set_debug_function(_debug, speed=False)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
339 try:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
340 script = jedi.Script(*args, **kwargs)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
341 return getattr(script, name)()
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
342 except Exception as e:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
343 source = kwargs.get('source')
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
344 sc_args = []
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
345 sc_args.extend(repr(arg) for arg in args)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
346 sc_args.extend("{0}={1}".format(k, "source" if k == "source"
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
347 else repr(v))
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
348 for (k, v) in kwargs.items())
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
349
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
350 data = {
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
351 "traceback": traceback.format_exc(),
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
352 "jedi_debug_info": {'script_args': ", ".join(sc_args),
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
353 'source': source,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
354 'method': name,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
355 'debug_info': debug_info}
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
356 }
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
357 raise rpc.Fault(message=str(e),
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
358 code=500,
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
359 data=data)
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
360 finally:
156cbb54f344 Add elpy and deps
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
diff changeset
361 jedi.set_debug_function(None)