Skip to content

Commit 5ff7e3d

Browse files
committed
Actually do goto when follow_imports is used
Fixes #945.
1 parent 5a8b954 commit 5ff7e3d

File tree

3 files changed

+25
-14
lines changed

3 files changed

+25
-14
lines changed

jedi/api/__init__.py

+10-7
Original file line numberDiff line numberDiff line change
@@ -226,19 +226,22 @@ def goto_assignments(self, follow_imports=False):
226226
def filter_follow_imports(names, check):
227227
for name in names:
228228
if check(name):
229-
for context in name.infer():
230-
yield context.name
229+
for result in filter_follow_imports(name.goto(), check):
230+
yield result
231231
else:
232232
yield name
233233

234234
names = self._goto()
235235
if follow_imports:
236-
names = filter_follow_imports(names, lambda name: name.api_type == 'module')
236+
def check(name):
237+
if isinstance(name, er.ModuleName):
238+
return False
239+
return name.api_type == 'module'
237240
else:
238-
names = filter_follow_imports(
239-
names,
240-
lambda name: isinstance(name, imports.SubModuleName)
241-
)
241+
def check(name):
242+
return isinstance(name, imports.SubModuleName)
243+
244+
names = filter_follow_imports(names, check)
242245

243246
defs = [classes.Definition(self._evaluator, d) for d in set(names)]
244247
return helpers.sorted_definitions(defs)

jedi/evaluate/filters.py

+9
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ class AbstractNameDefinition(object):
2020
def infer(self):
2121
raise NotImplementedError
2222

23+
@abstractmethod
24+
def goto(self):
25+
# Typically names are already definitions and therefore a goto on that
26+
# name will always result on itself.
27+
return set([self])
28+
2329
def get_root_context(self):
2430
return self.parent_context.get_root_context()
2531

@@ -44,6 +50,9 @@ def __init__(self, parent_context, tree_name):
4450
self.parent_context = parent_context
4551
self.tree_name = tree_name
4652

53+
def goto(self):
54+
return self.parent_context.evaluator.goto(self.parent_context, self.tree_name)
55+
4756
@property
4857
def string_name(self):
4958
return self.tree_name.value

jedi/evaluate/imports.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def get_init_path(directory_path):
141141

142142
class ImportName(AbstractNameDefinition):
143143
start_pos = (1, 0)
144+
_level = 0
144145

145146
def __init__(self, parent_context, string_name):
146147
self.parent_context = parent_context
@@ -151,8 +152,12 @@ def infer(self):
151152
self.parent_context.evaluator,
152153
[self.string_name],
153154
self.parent_context,
155+
level=self._level,
154156
).follow()
155157

158+
def goto(self):
159+
return [m.name for m in self.infer()]
160+
156161
def get_root_context(self):
157162
# Not sure if this is correct.
158163
return self.parent_context.get_root_context()
@@ -163,13 +168,7 @@ def api_type(self):
163168

164169

165170
class SubModuleName(ImportName):
166-
def infer(self):
167-
return Importer(
168-
self.parent_context.evaluator,
169-
[self.string_name],
170-
self.parent_context,
171-
level=1
172-
).follow()
171+
_level = 1
173172

174173

175174
class Importer(object):

0 commit comments

Comments
 (0)