Fix a few more goto_definition error_node imports

This commit is contained in:
Dave Halter
2019-03-28 09:34:57 +01:00
parent ab8d7e8659
commit 2ad652a071
3 changed files with 29 additions and 12 deletions

View File

@@ -290,7 +290,7 @@ 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)
else:
result = self.follow_error_node_imports_if_possible(context, name)
if result is not None:
return result
@@ -299,6 +299,8 @@ class Evaluator(object):
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,7 +332,7 @@ class Evaluator(object):
elif type_ in ('import_from', 'import_name'):
module_names = imports.infer_import(context, name, is_goto=True)
return module_names
else:
contexts = self.follow_error_node_imports_if_possible(context, name)
if contexts is not None:
return [context.name for context in contexts]

View File

@@ -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 = []

View File

@@ -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