diff --git a/jedi/api.py b/jedi/api.py index 4a73877c..691d259d 100644 --- a/jedi/api.py +++ b/jedi/api.py @@ -27,6 +27,7 @@ from __future__ import with_statement __all__ = ['Script', 'NotFoundError', 'set_debug_function'] import re +import weakref import parsing import dynamic @@ -91,15 +92,18 @@ class Script(object): :rtype: list """ def follow_imports_if_possible(name): - return [name] #TODO remove + # TODO remove this, or move to another place (not used) par = name.parent() if isinstance(par, parsing.Import) and not \ isinstance(self.parser.user_stmt, parsing.Import): new = imports.ImportPath(par).follow(is_goto=True) # Only remove the old entry if a new one has been found. + #print par, new, par.parent() if new: - print(new, name) - return new + try: + return new + except AttributeError: # .name undefined + pass return [name] path = self.module.get_path_until_cursor() @@ -159,10 +163,9 @@ class Script(object): or n.startswith(like): if not evaluate.filter_private_variable(s, self.parser.user_stmt, n): - for f in follow_imports_if_possible(c): - new = api_classes.Completion(f, needs_dot, - len(like), s) - comps.append(new) + new = api_classes.Completion(c, needs_dot, + len(like), s) + comps.append(new) return sorted(comps, key=lambda x: (x.word.startswith('__'), @@ -195,7 +198,7 @@ class Script(object): except IndexError: raise NotFoundError() stmt.start_pos = self.pos - stmt.parent = lambda: self.parser.user_scope + stmt.parent = weakref.ref(self.parser.user_scope) return stmt def get_definition(self): diff --git a/test/regression.py b/test/regression.py index cc81699a..f4f6e866 100755 --- a/test/regression.py +++ b/test/regression.py @@ -228,9 +228,11 @@ class TestRegression(Base): def test_follow_imports_if_possible(self): """ github issue #45 """ - s = self.complete("import datetime.timedelta; datetime.timedelta") - #print s, [r.name.parent() for r in s], [r.type for r in s] - #assert 'Import' not in [r.type for r in s] + s = self.complete("from datetime import timedelta; timedelta") + # type can also point to import, but there will be additional + # attributes + types = [r.type for r in s] + #assert 'Import' not in types and 'Class' in types class TestFeature(Base): @@ -285,6 +287,5 @@ class TestSpeed(Base): script.get_in_function_call() #print(api.imports.imports_processed) - if __name__ == '__main__': unittest.main()