From 1c105b5c684466e3ce527d2d38a7f42ff6e4b4e4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 27 Mar 2019 00:53:35 +0100 Subject: [PATCH] Follow error node imports properly in goto assignments as well --- jedi/evaluate/__init__.py | 31 ++++++++++++++++++++++--------- test/completion/imports.py | 6 ++++++ 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 5d0dd384..597673a5 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -290,18 +290,27 @@ class Evaluator(object): if type_ in ('import_from', 'import_name'): return imports.infer_import(context, name) - error_node = tree.search_ancestor(name, 'error_node') - if error_node is not None: - first_name = error_node.get_first_leaf().value - if first_name == 'from': - level, names = helpers.parse_dotted_names( - error_node.children, - is_import_from=True - ) - return imports.Importer(self, names, context.get_root_context(), level).follow() + result = self.follow_error_node_imports_if_possible(context, name) + if result is not None: + return result return helpers.evaluate_call_of_leaf(context, name) + def follow_error_node_imports_if_possible(self, context, name): + error_node = tree.search_ancestor(name, 'error_node') + if error_node is not None: + # Make it possible to infer stuff like `import foo.` or + # `from foo.bar`. + first_name = error_node.get_first_leaf().value + if first_name in ('from', 'import'): + is_import_from = first_name == 'from' + level, names = helpers.parse_dotted_names( + error_node.children, + is_import_from=is_import_from + ) + return imports.Importer(self, names, context.get_root_context(), level).follow() + return None + def goto(self, context, name): definition = name.get_definition(import_name_always=True) if definition is not None: @@ -320,6 +329,10 @@ class Evaluator(object): module_names = imports.infer_import(context, name, is_goto=True) return module_names + contexts = self.follow_error_node_imports_if_possible(context, name) + if contexts is not None: + return [context.name for context in contexts] + par = name.parent node_type = par.type if node_type == 'argument' and par.children[1] == '=' and par.children[0] == name: diff --git a/test/completion/imports.py b/test/completion/imports.py index bb6dbc9e..c684c833 100644 --- a/test/completion/imports.py +++ b/test/completion/imports.py @@ -119,6 +119,12 @@ def broken_import(): #? import_tree.mod1 from import_tree.mod1 + #? 20 import_tree.mod1 + import import_tree.mod1. + + #! ['module json'] + from json + def test_import_priorities(): """