Skip to content

Commit 4c0e740

Browse files
mpoindexterDonJayamanne
authored andcommitted
Add code to make definition lookup work with latest version of Jedi (#1085)
* Add code to make definition lookup work with latest version of Jedi * Change function names to include Jedi version they are associated with
1 parent ad563ee commit 4c0e740

1 file changed

Lines changed: 58 additions & 14 deletions

File tree

pythonFiles/completion.py

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -313,20 +313,7 @@ def _top_definition(self, definition):
313313
return d
314314
return definition
315315

316-
def _extract_range(self, definition):
317-
"""Provides the definition range of a given definition
318-
319-
For regular symbols it returns the start and end location of the
320-
characters making up the symbol.
321-
322-
For scoped containers it will return the entire definition of the
323-
scope.
324-
325-
The scope that jedi provides ends with the first character of the next
326-
scope so it's not ideal. For vscode we need the scope to end with the
327-
last character of actual code. That's why we extract the lines that
328-
make up our scope and trim the trailing whitespace.
329-
"""
316+
def _extract_range_jedi_0_9_0(self, definition):
330317
from jedi import common
331318
from jedi.parser.utils import load_parser
332319
# get the scope range
@@ -366,6 +353,63 @@ def _extract_range(self, definition):
366353
'end_line': definition.line - 1,
367354
'end_column': definition.column
368355
}
356+
357+
def _extract_range_jedi_0_10_1(self, definition):
358+
from jedi import common
359+
from jedi.parser.python import parse
360+
# get the scope range
361+
try:
362+
if definition.type in ['class', 'function']:
363+
tree_name = definition._name.tree_name
364+
scope = tree_name.get_definition()
365+
start_line = scope.start_pos[0] - 1
366+
start_column = scope.start_pos[1]
367+
# get the lines
368+
code = scope.get_code(include_prefix=False)
369+
lines = common.splitlines(code)
370+
# trim the lines
371+
lines = '\n'.join(lines).rstrip().split('\n')
372+
end_line = start_line + len(lines) - 1
373+
end_column = len(lines[-1]) - 1
374+
else:
375+
symbol = definition._name.tree_name
376+
start_line = symbol.start_pos[0] - 1
377+
start_column = symbol.start_pos[1]
378+
end_line = symbol.end_pos[0] - 1
379+
end_column = symbol.end_pos[1]
380+
return {
381+
'start_line': start_line,
382+
'start_column': start_column,
383+
'end_line': end_line,
384+
'end_column': end_column
385+
}
386+
except Exception as e:
387+
return {
388+
'start_line': definition.line - 1,
389+
'start_column': definition.column,
390+
'end_line': definition.line - 1,
391+
'end_column': definition.column
392+
}
393+
394+
def _extract_range(self, definition):
395+
"""Provides the definition range of a given definition
396+
397+
For regular symbols it returns the start and end location of the
398+
characters making up the symbol.
399+
400+
For scoped containers it will return the entire definition of the
401+
scope.
402+
403+
The scope that jedi provides ends with the first character of the next
404+
scope so it's not ideal. For vscode we need the scope to end with the
405+
last character of actual code. That's why we extract the lines that
406+
make up our scope and trim the trailing whitespace.
407+
"""
408+
if jedi.__version__ in ('0.9.0', '0.10.0'):
409+
return self._extract_range_jedi_0_9_0(definition)
410+
else:
411+
return self._extract_range_jedi_0_10_1(definition)
412+
369413
def _get_definitionsx(self, definitions, identifier=None, ignoreNoModulePath=False):
370414
"""Serialize response to be read from VSCode.
371415

0 commit comments

Comments
 (0)