diff --git a/CHANGELOG.rst b/CHANGELOG.rst index a1de3b47..3cc23d43 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -6,6 +6,8 @@ Changelog Unreleased ++++++++++ +- Implict namespaces are now a separate types in ``Name().type`` + 0.18.0 (2020-12-25) +++++++++++++++++++ diff --git a/jedi/api/completion.py b/jedi/api/completion.py index f8647248..ff4f5278 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -627,7 +627,7 @@ def search_in_module(inference_state, module_context, names, wanted_names, new_names = [] for n in names: if s == n.string_name: - if n.tree_name is not None and n.api_type == 'module' \ + if n.tree_name is not None and n.api_type in ('module', 'namespace') \ and ignore_imports: continue new_names += complete_trailer( diff --git a/jedi/api/project.py b/jedi/api/project.py index 8c438f26..dfcc7ff2 100644 --- a/jedi/api/project.py +++ b/jedi/api/project.py @@ -439,5 +439,5 @@ def get_default_project(path=None): def _remove_imports(names): return [ n for n in names - if n.tree_name is None or n.api_type != 'module' + if n.tree_name is None or n.api_type not in ('module', 'namespace') ] diff --git a/jedi/api/refactoring/__init__.py b/jedi/api/refactoring/__init__.py index 14c4d910..84513da0 100644 --- a/jedi/api/refactoring/__init__.py +++ b/jedi/api/refactoring/__init__.py @@ -156,8 +156,8 @@ def rename(inference_state, definitions, new_name): def inline(inference_state, names): if not names: raise RefactoringError("There is no name under the cursor") - if any(n.api_type == 'module' for n in names): - raise RefactoringError("Cannot inline imports or modules") + if any(n.api_type in ('module', 'namespace') for n in names): + raise RefactoringError("Cannot inline imports, modules or namespaces") if any(n.tree_name is None for n in names): raise RefactoringError("Cannot inline builtins/extensions") diff --git a/jedi/inference/imports.py b/jedi/inference/imports.py index d2b42e43..56d6ebb9 100644 --- a/jedi/inference/imports.py +++ b/jedi/inference/imports.py @@ -339,7 +339,7 @@ class Importer: values = self.follow() for value in values: # Non-modules are not completable. - if value.api_type != 'module': # not a module + if value.api_type not in ('module', 'namespace'): # not a module continue if not value.is_compiled(): # sub_modules_dict is not implemented for compiled modules. diff --git a/jedi/inference/value/namespace.py b/jedi/inference/value/namespace.py index fe629a07..f9f5d09f 100644 --- a/jedi/inference/value/namespace.py +++ b/jedi/inference/value/namespace.py @@ -20,10 +20,7 @@ class ImplicitNamespaceValue(Value, SubModuleDictMixin): """ Provides support for implicit namespace packages """ - # Is a module like every other module, because if you import an empty - # folder foobar it will be available as an object: - # . - api_type = 'module' + api_type = 'namespace' parent_context = None def __init__(self, inference_state, string_names, paths): diff --git a/test/refactor/inline.py b/test/refactor/inline.py index d881b620..213ef0be 100644 --- a/test/refactor/inline.py +++ b/test/refactor/inline.py @@ -68,7 +68,7 @@ from import_tree import inline_mod #? 11 error test(inline_mod) # ++++++++++++++++++++++++++++++++++++++++++++++++++ -Cannot inline imports or modules +Cannot inline imports, modules or namespaces # -------------------------------------------------- module-works from import_tree import inline_mod #? 22 diff --git a/test/test_inference/test_implicit_namespace_package.py b/test/test_inference/test_implicit_namespace_package.py index 5b242b66..4fbbfccf 100644 --- a/test/test_inference/test_implicit_namespace_package.py +++ b/test/test_inference/test_implicit_namespace_package.py @@ -55,7 +55,7 @@ def test_implicit_nested_namespace_package(Script): assert len(result) == 1 implicit_pkg, = Script(code, project=project).infer(column=10) - assert implicit_pkg.type == 'module' + assert implicit_pkg.type == 'namespace' assert implicit_pkg.module_path is None