diff --git a/jedi/evaluate/analysis.py b/jedi/evaluate/analysis.py index 60952546..8d9932a1 100644 --- a/jedi/evaluate/analysis.py +++ b/jedi/evaluate/analysis.py @@ -216,6 +216,8 @@ def get_module_statements(module): for scope in module.walk(): for imp in set(scope.imports): import_names |= set(imp.get_defined_names()) + if imp.is_nested(): + import_names |= set(path[-1] for path in imp.paths()) stmts |= add_stmts(scope.statements) stmts |= add_stmts(r for r in scope.returns if r is not None) diff --git a/jedi/evaluate/imports.py b/jedi/evaluate/imports.py index 3846f3a7..c9a89b28 100644 --- a/jedi/evaluate/imports.py +++ b/jedi/evaluate/imports.py @@ -128,7 +128,8 @@ class ImportWrapper(pr.Base): for s in scopes)) else: print(self._import, scopes, rest) - if self._import.type == 'import_from': + if self._import.type == 'import_from' \ + or importer.str_import_path == ('os', 'path'): scopes = importer.follow_rest(scopes[0], rest) else: scopes = [] diff --git a/jedi/parser/tree.py b/jedi/parser/tree.py index 22dc09af..057ebad7 100644 --- a/jedi/parser/tree.py +++ b/jedi/parser/tree.py @@ -717,7 +717,7 @@ class SubModule(Scope, Module): # the future print statement). for imp in self.imports: if isinstance(imp, ImportFrom) and imp.level == 0: - for path in imp._paths(): + for path in imp.paths(): if [str(name) for name in path] == ['__future__', 'absolute_import']: return True return False @@ -986,7 +986,7 @@ class Import(Simple): except KeyError: pass - for path in self._paths(): + for path in self.paths(): if name in path: return path[:path.index(name) + 1] raise ValueError('Name should be defined in the import itself') @@ -1040,9 +1040,13 @@ class ImportFrom(Import): """ The last name defined in a star import. """ - return self._paths()[-1][-1] + return self.paths()[-1][-1] - def _paths(self): + def paths(self): + """ + The import paths defined in an import statement. Typically an array + like this: ``[, ]``. + """ for n in self.children[1:]: if n not in ('.', '...'): break @@ -1070,7 +1074,7 @@ class ImportName(Import): """The level parameter of ``__import__``.""" return 0 # Obviously 0 for imports without from. - def _paths(self): + def paths(self): return [path for path, alias in self._dotted_as_names()] def _dotted_as_names(self):