From cabdb7f032abad9f7ecc5f427fe9455a3a2d4d00 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 5 May 2019 21:49:55 +0200 Subject: [PATCH] sub_modules_dict improvement --- jedi/evaluate/context/module.py | 4 ++-- jedi/evaluate/gradual/stub_context.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/jedi/evaluate/context/module.py b/jedi/evaluate/context/module.py index b22747c2..781d656a 100644 --- a/jedi/evaluate/context/module.py +++ b/jedi/evaluate/context/module.py @@ -37,7 +37,7 @@ class ModuleName(ContextNameMixin, AbstractNameDefinition): class SubModuleDictMixin(object): @evaluator_method_cache() - def _sub_modules_dict(self): + def sub_modules_dict(self): """ Lists modules in the directory of this module (if this module is a package). @@ -80,7 +80,7 @@ class ModuleMixin(SubModuleDictMixin): ), GlobalNameFilter(self, self.tree_node), ) - yield DictFilter(self._sub_modules_dict()) + yield DictFilter(self.sub_modules_dict()) yield DictFilter(self._module_attributes_dict()) for star_filter in self.iter_star_filters(): yield star_filter diff --git a/jedi/evaluate/gradual/stub_context.py b/jedi/evaluate/gradual/stub_context.py index f0089648..f9309f6b 100644 --- a/jedi/evaluate/gradual/stub_context.py +++ b/jedi/evaluate/gradual/stub_context.py @@ -20,6 +20,23 @@ class StubModuleContext(_StubContextMixin, ModuleContext): super(StubModuleContext, self).__init__(*args, **kwargs) self.non_stub_context_set = non_stub_context_set + def sub_modules_dict(self): + """ + We have to overwrite this, because it's possible to have stubs that + don't have code for all the child modules. At the time of writing this + there are for example no stubs for `json.tool`. + """ + names = {} + for context in self.non_stub_context_set: + try: + method = context.sub_modules_dict + except AttributeError: + pass + else: + names.update(method()) + names.update(super(StubModuleContext, self).sub_modules_dict()) + return names + def _get_first_non_stub_filters(self): for context in self.non_stub_context_set: yield next(context.get_filters(search_global=False))