From 2ad652a0714cfc789d310bd4142421c56764b1e4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 28 Mar 2019 09:34:57 +0100 Subject: [PATCH] Fix a few more goto_definition error_node imports --- jedi/evaluate/__init__.py | 21 ++++++++++++--------- jedi/evaluate/helpers.py | 12 ++++++++++-- test/completion/imports.py | 8 +++++++- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index e97bc692..a71bfc9f 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -290,15 +290,17 @@ class Evaluator(object): return check_tuple_assignments(self, c_node, for_types) if type_ in ('import_from', 'import_name'): return imports.infer_import(context, name) - - result = self.follow_error_node_imports_if_possible(context, name) - if result is not None: - return result + else: + 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 'expr_stmt', 'del_stmt', 'flow_stmt', + #'import_stmt', 'global_stmt', 'nonlocal_stmt' 'assert_stmt' if error_node is not None: # Make it possible to infer stuff like `import foo.` or # `from foo.bar`. @@ -307,7 +309,8 @@ class Evaluator(object): is_import_from = first_name == 'from' level, names = helpers.parse_dotted_names( error_node.children, - is_import_from=is_import_from + is_import_from=is_import_from, + until_node=name, ) return imports.Importer(self, names, context.get_root_context(), level).follow() return None @@ -329,10 +332,10 @@ class Evaluator(object): elif type_ in ('import_from', 'import_name'): 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] + else: + 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 diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 9a65eb38..15335fb3 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -241,7 +241,7 @@ def execute_evaluated(context, *value_list): return context.evaluator.execute(context, arguments) -def parse_dotted_names(nodes, is_import_from): +def parse_dotted_names(nodes, is_import_from, until_node=None): level = 0 names = [] for node in nodes[1:]: @@ -249,9 +249,17 @@ def parse_dotted_names(nodes, is_import_from): if not names: level += len(node.value) elif node.type == 'dotted_name': - names += node.children[::2] + for n in node.children[::2]: + names.append(n) + if n is until_node: + break + else: + continue + break elif node.type == 'name': names.append(node) + if node is until_node: + break elif node == ',': if not is_import_from: names = [] diff --git a/test/completion/imports.py b/test/completion/imports.py index c684c833..632a4ded 100644 --- a/test/completion/imports.py +++ b/test/completion/imports.py @@ -119,8 +119,14 @@ def broken_import(): #? import_tree.mod1 from import_tree.mod1 - #? 20 import_tree.mod1 + #? 25 import_tree.mod1 import import_tree.mod1. + #? 25 import_tree.mod1 + impo5t import_tree.mod1.foo + #? 25 import_tree.mod1 + import import_tree.mod1.foo. + #? 31 import_tree.mod1 + import json, import_tree.mod1.foo. #! ['module json'] from json