1
0
forked from VimPlug/jedi

Avoid failing if additional dynamic modules is defined with files that don't exist

This commit is contained in:
Dave Halter
2019-06-06 00:43:24 +02:00
parent 84eb91beaa
commit b98bf07767
2 changed files with 29 additions and 11 deletions

View File

@@ -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

View File

@@ -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()