Actually do goto when follow_imports is used

Fixes #945.
This commit is contained in:
Dave Halter
2017-09-13 00:28:49 +02:00
parent 5a8b9541a7
commit 5ff7e3dbbe
3 changed files with 25 additions and 14 deletions

View File

@@ -226,19 +226,22 @@ class Script(object):
def filter_follow_imports(names, check):
for name in names:
if check(name):
for context in name.infer():
yield context.name
for result in filter_follow_imports(name.goto(), check):
yield result
else:
yield name
names = self._goto()
if follow_imports:
names = filter_follow_imports(names, lambda name: name.api_type == 'module')
def check(name):
if isinstance(name, er.ModuleName):
return False
return name.api_type == 'module'
else:
names = filter_follow_imports(
names,
lambda name: isinstance(name, imports.SubModuleName)
)
def check(name):
return isinstance(name, imports.SubModuleName)
names = filter_follow_imports(names, check)
defs = [classes.Definition(self._evaluator, d) for d in set(names)]
return helpers.sorted_definitions(defs)

View File

@@ -20,6 +20,12 @@ class AbstractNameDefinition(object):
def infer(self):
raise NotImplementedError
@abstractmethod
def goto(self):
# Typically names are already definitions and therefore a goto on that
# name will always result on itself.
return set([self])
def get_root_context(self):
return self.parent_context.get_root_context()
@@ -44,6 +50,9 @@ class AbstractTreeName(AbstractNameDefinition):
self.parent_context = parent_context
self.tree_name = tree_name
def goto(self):
return self.parent_context.evaluator.goto(self.parent_context, self.tree_name)
@property
def string_name(self):
return self.tree_name.value

View File

@@ -141,6 +141,7 @@ def get_init_path(directory_path):
class ImportName(AbstractNameDefinition):
start_pos = (1, 0)
_level = 0
def __init__(self, parent_context, string_name):
self.parent_context = parent_context
@@ -151,8 +152,12 @@ class ImportName(AbstractNameDefinition):
self.parent_context.evaluator,
[self.string_name],
self.parent_context,
level=self._level,
).follow()
def goto(self):
return [m.name for m in self.infer()]
def get_root_context(self):
# Not sure if this is correct.
return self.parent_context.get_root_context()
@@ -163,13 +168,7 @@ class ImportName(AbstractNameDefinition):
class SubModuleName(ImportName):
def infer(self):
return Importer(
self.parent_context.evaluator,
[self.string_name],
self.parent_context,
level=1
).follow()
_level = 1
class Importer(object):