mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 23:04:48 +08:00
@@ -226,19 +226,22 @@ class Script(object):
|
|||||||
def filter_follow_imports(names, check):
|
def filter_follow_imports(names, check):
|
||||||
for name in names:
|
for name in names:
|
||||||
if check(name):
|
if check(name):
|
||||||
for context in name.infer():
|
for result in filter_follow_imports(name.goto(), check):
|
||||||
yield context.name
|
yield result
|
||||||
else:
|
else:
|
||||||
yield name
|
yield name
|
||||||
|
|
||||||
names = self._goto()
|
names = self._goto()
|
||||||
if follow_imports:
|
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:
|
else:
|
||||||
names = filter_follow_imports(
|
def check(name):
|
||||||
names,
|
return isinstance(name, imports.SubModuleName)
|
||||||
lambda name: isinstance(name, imports.SubModuleName)
|
|
||||||
)
|
names = filter_follow_imports(names, check)
|
||||||
|
|
||||||
defs = [classes.Definition(self._evaluator, d) for d in set(names)]
|
defs = [classes.Definition(self._evaluator, d) for d in set(names)]
|
||||||
return helpers.sorted_definitions(defs)
|
return helpers.sorted_definitions(defs)
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ class AbstractNameDefinition(object):
|
|||||||
def infer(self):
|
def infer(self):
|
||||||
raise NotImplementedError
|
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):
|
def get_root_context(self):
|
||||||
return self.parent_context.get_root_context()
|
return self.parent_context.get_root_context()
|
||||||
|
|
||||||
@@ -44,6 +50,9 @@ class AbstractTreeName(AbstractNameDefinition):
|
|||||||
self.parent_context = parent_context
|
self.parent_context = parent_context
|
||||||
self.tree_name = tree_name
|
self.tree_name = tree_name
|
||||||
|
|
||||||
|
def goto(self):
|
||||||
|
return self.parent_context.evaluator.goto(self.parent_context, self.tree_name)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def string_name(self):
|
def string_name(self):
|
||||||
return self.tree_name.value
|
return self.tree_name.value
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ def get_init_path(directory_path):
|
|||||||
|
|
||||||
class ImportName(AbstractNameDefinition):
|
class ImportName(AbstractNameDefinition):
|
||||||
start_pos = (1, 0)
|
start_pos = (1, 0)
|
||||||
|
_level = 0
|
||||||
|
|
||||||
def __init__(self, parent_context, string_name):
|
def __init__(self, parent_context, string_name):
|
||||||
self.parent_context = parent_context
|
self.parent_context = parent_context
|
||||||
@@ -151,8 +152,12 @@ class ImportName(AbstractNameDefinition):
|
|||||||
self.parent_context.evaluator,
|
self.parent_context.evaluator,
|
||||||
[self.string_name],
|
[self.string_name],
|
||||||
self.parent_context,
|
self.parent_context,
|
||||||
|
level=self._level,
|
||||||
).follow()
|
).follow()
|
||||||
|
|
||||||
|
def goto(self):
|
||||||
|
return [m.name for m in self.infer()]
|
||||||
|
|
||||||
def get_root_context(self):
|
def get_root_context(self):
|
||||||
# Not sure if this is correct.
|
# Not sure if this is correct.
|
||||||
return self.parent_context.get_root_context()
|
return self.parent_context.get_root_context()
|
||||||
@@ -163,13 +168,7 @@ class ImportName(AbstractNameDefinition):
|
|||||||
|
|
||||||
|
|
||||||
class SubModuleName(ImportName):
|
class SubModuleName(ImportName):
|
||||||
def infer(self):
|
_level = 1
|
||||||
return Importer(
|
|
||||||
self.parent_context.evaluator,
|
|
||||||
[self.string_name],
|
|
||||||
self.parent_context,
|
|
||||||
level=1
|
|
||||||
).follow()
|
|
||||||
|
|
||||||
|
|
||||||
class Importer(object):
|
class Importer(object):
|
||||||
|
|||||||
Reference in New Issue
Block a user