mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-10 07:41:51 +08:00
Avoid import recursions in other ways
This commit is contained in:
@@ -279,10 +279,10 @@ class Script(object):
|
|||||||
|
|
||||||
def _goto_assignments(self, follow_imports, follow_builtin_imports,
|
def _goto_assignments(self, follow_imports, follow_builtin_imports,
|
||||||
only_stubs=False, prefer_stubs=False):
|
only_stubs=False, prefer_stubs=False):
|
||||||
def filter_follow_imports(names, check):
|
def filter_follow_imports(names):
|
||||||
for name in names:
|
for name in names:
|
||||||
if check(name):
|
if name.is_import():
|
||||||
new_names = list(filter_follow_imports(name.goto(), check))
|
new_names = list(filter_follow_imports(name.goto()))
|
||||||
found_builtin = False
|
found_builtin = False
|
||||||
if follow_builtin_imports:
|
if follow_builtin_imports:
|
||||||
for new_name in new_names:
|
for new_name in new_names:
|
||||||
@@ -306,7 +306,7 @@ class Script(object):
|
|||||||
names = list(self._inference_state.goto(context, tree_name))
|
names = list(self._inference_state.goto(context, tree_name))
|
||||||
|
|
||||||
if follow_imports:
|
if follow_imports:
|
||||||
names = filter_follow_imports(names, lambda name: name.is_import())
|
names = filter_follow_imports(names)
|
||||||
names = convert_names(
|
names = convert_names(
|
||||||
names,
|
names,
|
||||||
only_stubs=only_stubs,
|
only_stubs=only_stubs,
|
||||||
|
|||||||
@@ -88,18 +88,6 @@ class NameFinder(object):
|
|||||||
for filter in filters:
|
for filter in filters:
|
||||||
names = filter.get(self._string_name)
|
names = filter.get(self._string_name)
|
||||||
if names:
|
if names:
|
||||||
if len(names) == 1:
|
|
||||||
n, = names
|
|
||||||
if isinstance(n, TreeNameDefinition):
|
|
||||||
# Something somewhere went terribly wrong. This
|
|
||||||
# typically happens when using goto on an import in an
|
|
||||||
# __init__ file. I think we need a better solution, but
|
|
||||||
# it's kind of hard, because for Jedi it's not clear
|
|
||||||
# that that name has not been defined, yet.
|
|
||||||
if n.tree_name == self._name:
|
|
||||||
def_ = self._name.get_definition()
|
|
||||||
if def_ is not None and def_.type == 'import_from':
|
|
||||||
continue
|
|
||||||
break
|
break
|
||||||
|
|
||||||
debug.dbg('finder.filter_name %s in (%s): %s@%s',
|
debug.dbg('finder.filter_name %s in (%s): %s@%s',
|
||||||
|
|||||||
@@ -95,7 +95,8 @@ def goto_import(context, tree_name):
|
|||||||
analysis_errors=False
|
analysis_errors=False
|
||||||
) for c in values
|
) for c in values
|
||||||
])
|
])
|
||||||
if names:
|
# Avoid recursion on the same names.
|
||||||
|
if names and not any(n.tree_name is tree_name for n in names):
|
||||||
return names
|
return names
|
||||||
|
|
||||||
path = import_path + (from_import_name,)
|
path = import_path + (from_import_name,)
|
||||||
|
|||||||
@@ -219,15 +219,16 @@ def test_goto_assignments_follow_imports(Script):
|
|||||||
|
|
||||||
|
|
||||||
def test_goto_module(Script):
|
def test_goto_module(Script):
|
||||||
def check(line, expected):
|
def check(line, expected, follow_imports=False):
|
||||||
script = Script(path=path, line=line)
|
script = Script(path=path, line=line)
|
||||||
module, = script.goto_assignments()
|
module, = script.goto_assignments(follow_imports=follow_imports)
|
||||||
assert module.module_path == expected
|
assert module.module_path == expected
|
||||||
|
|
||||||
base_path = os.path.join(os.path.dirname(__file__), 'simple_import')
|
base_path = os.path.join(os.path.dirname(__file__), 'simple_import')
|
||||||
path = os.path.join(base_path, '__init__.py')
|
path = os.path.join(base_path, '__init__.py')
|
||||||
|
|
||||||
check(1, os.path.join(base_path, 'module.py'))
|
check(1, os.path.join(base_path, 'module.py'))
|
||||||
|
check(1, os.path.join(base_path, 'module.py'), follow_imports=True)
|
||||||
check(5, os.path.join(base_path, 'module2.py'))
|
check(5, os.path.join(base_path, 'module2.py'))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user