1
0
forked from VimPlug/jedi

Add follow_imports to Definition.goto, fixes #1474

This commit is contained in:
Dave Halter
2020-01-22 18:29:02 +01:00
parent 5c68304bec
commit dbdd556a2b
5 changed files with 46 additions and 21 deletions

View File

@@ -26,6 +26,8 @@ Changelog
- ``usages`` deprecated, use ``get_references`` instead
- ``jedi.names`` deprecated, use ``jedi.Script(...).get_names()``
- ``BaseDefinition.goto_assignments`` renamed to ``BaseDefinition.goto``
- Add follow_imports to ``Definition.goto``. Now its signature matches
``Script.goto``.
- Python 2 support deprecated. For this release it is best effort. Python 2 has
reached the end of its life and now it's just about a smooth transition.

View File

@@ -286,24 +286,6 @@ class Script(object):
def _goto(self, line, column, follow_imports=False, follow_builtin_imports=False,
only_stubs=False, prefer_stubs=False):
def filter_follow_imports(names):
for name in names:
if name.is_import():
new_names = list(filter_follow_imports(name.goto()))
found_builtin = False
if follow_builtin_imports:
for new_name in new_names:
if new_name.start_pos is None:
found_builtin = True
if found_builtin:
yield name
else:
for new_name in new_names:
yield new_name
else:
yield name
tree_name = self._module_node.get_name_of_position((line, column))
if tree_name is None:
# Without a name we really just want to jump to the result e.g.
@@ -328,7 +310,7 @@ class Script(object):
names = list(name.goto())
if follow_imports:
names = filter_follow_imports(names)
names = helpers.filter_follow_imports(names)
names = convert_names(
names,
only_stubs=only_stubs,

View File

@@ -20,6 +20,7 @@ from jedi.inference.gradual.conversion import convert_names, convert_values
from jedi.inference.base_value import ValueSet
from jedi.api.keywords import KeywordName
from jedi.api import completion_cache
from jedi.api.helpers import filter_follow_imports
def _sort_names_by_start_pos(names):
@@ -368,13 +369,17 @@ class BaseDefinition(object):
)
return self.goto(**kwargs)
def _goto(self, only_stubs=False, prefer_stubs=False):
def _goto(self, follow_imports=False, follow_builtin_imports=False,
only_stubs=False, prefer_stubs=False):
if not self._name.is_value_name:
return []
names = self._name.goto()
if follow_imports:
names = filter_follow_imports(names, follow_builtin_imports)
names = convert_names(
self._name.goto(),
names,
only_stubs=only_stubs,
prefer_stubs=prefer_stubs,
)

View File

@@ -170,6 +170,28 @@ def infer(inference_state, context, leaf):
return definitions
def filter_follow_imports(names, follow_builtin_imports=False):
for name in names:
if name.is_import():
new_names = list(filter_follow_imports(
name.goto(),
follow_builtin_imports=follow_builtin_imports,
))
found_builtin = False
if follow_builtin_imports:
for new_name in new_names:
if new_name.start_pos is None:
found_builtin = True
if found_builtin:
yield name
else:
for new_name in new_names:
yield new_name
else:
yield name
class CallDetails(object):
def __init__(self, bracket_leaf, children, position):
['bracket_leaf', 'call_index', 'keyword_name_str']

View File

@@ -544,3 +544,17 @@ def test_inheritance_module_path(Script, goto, code, name, file_name):
assert func.type == 'function'
assert func.name == name
assert func.module_path == os.path.join(base_path, file_name)
def test_definition_goto_follow_imports(Script):
dumps = Script('from json import dumps\ndumps').get_names(references=True)[-1]
assert dumps.description == 'dumps'
no_follow, = dumps.goto()
assert no_follow.description == 'def dumps'
assert no_follow.line == 1
assert no_follow.column == 17
assert no_follow.module_name == '__main__'
follow, = dumps.goto(follow_imports=True)
assert follow.description == 'def dumps'
assert follow.line != 1
assert follow.module_name == 'json'