forked from VimPlug/jedi
Avoid failing if additional dynamic modules is defined with files that don't exist
This commit is contained in:
@@ -21,7 +21,7 @@ from jedi._compatibility import (FileNotFoundError, ImplicitNSInfo,
|
|||||||
force_unicode, unicode)
|
force_unicode, unicode)
|
||||||
from jedi import debug
|
from jedi import debug
|
||||||
from jedi import settings
|
from jedi import settings
|
||||||
from jedi.file_io import KnownContentFileIO, FolderIO
|
from jedi.file_io import KnownContentFileIO, FolderIO, FileIO
|
||||||
from jedi.parser_utils import get_cached_code_lines
|
from jedi.parser_utils import get_cached_code_lines
|
||||||
from jedi.evaluate import sys_path
|
from jedi.evaluate import sys_path
|
||||||
from jedi.evaluate import helpers
|
from jedi.evaluate import helpers
|
||||||
@@ -532,7 +532,10 @@ def get_modules_containing_name(evaluator, modules, name):
|
|||||||
if name not in code:
|
if name not in code:
|
||||||
return None
|
return None
|
||||||
new_file_io = KnownContentFileIO(file_io.path, code)
|
new_file_io = KnownContentFileIO(file_io.path, code)
|
||||||
return _load_module_from_path(evaluator, new_file_io, base_names)
|
m = _load_module_from_path(evaluator, new_file_io, base_names)
|
||||||
|
if isinstance(m, compiled.CompiledObject):
|
||||||
|
return None
|
||||||
|
return m
|
||||||
|
|
||||||
# skip non python modules
|
# skip non python modules
|
||||||
used_mod_paths = set()
|
used_mod_paths = set()
|
||||||
@@ -551,13 +554,17 @@ def get_modules_containing_name(evaluator, modules, name):
|
|||||||
if not settings.dynamic_params_for_other_modules:
|
if not settings.dynamic_params_for_other_modules:
|
||||||
return
|
return
|
||||||
|
|
||||||
for p in settings.additional_dynamic_modules:
|
def get_file_ios_to_check():
|
||||||
p = os.path.abspath(p)
|
for folder_io, base_names in folders_with_names_to_be_checked:
|
||||||
if p not in used_mod_paths:
|
for file_io in check_directory(folder_io):
|
||||||
folders_with_names_to_be_checked.append((FolderIO(p), None))
|
yield file_io, base_names
|
||||||
|
|
||||||
for folder_io, base_names in folders_with_names_to_be_checked:
|
for p in settings.additional_dynamic_modules:
|
||||||
for file_io in check_directory(folder_io):
|
p = os.path.abspath(p)
|
||||||
m = check_fs(file_io, base_names)
|
if p not in used_mod_paths:
|
||||||
if m is not None and not isinstance(m, compiled.CompiledObject):
|
yield FileIO(p), None
|
||||||
yield m
|
|
||||||
|
for file_io, base_names in get_file_ios_to_check():
|
||||||
|
m = check_fs(file_io, base_names)
|
||||||
|
if m is not None:
|
||||||
|
yield m
|
||||||
|
|||||||
@@ -21,3 +21,14 @@ def test_base_auto_import_modules(auto_import_json, Script):
|
|||||||
def test_auto_import_modules_imports(auto_import_json, Script):
|
def test_auto_import_modules_imports(auto_import_json, Script):
|
||||||
main, = Script('from json import tool; tool.main').goto_definitions()
|
main, = Script('from json import tool; tool.main').goto_definitions()
|
||||||
assert isinstance(main._name, CompiledContextName)
|
assert isinstance(main._name, CompiledContextName)
|
||||||
|
|
||||||
|
|
||||||
|
def test_additional_dynamic_modules(monkeypatch, Script):
|
||||||
|
# We could add further tests, but for now it's even more important that
|
||||||
|
# this doesn't fail.
|
||||||
|
monkeypatch.setattr(
|
||||||
|
settings,
|
||||||
|
'additional_dynamic_modules',
|
||||||
|
['/foo/bar/jedi_not_existing_file.py']
|
||||||
|
)
|
||||||
|
assert not Script('def some_func(f):\n f.').completions()
|
||||||
|
|||||||
Reference in New Issue
Block a user