From edb0bbd183033a8765144a8b8bb129849c773df4 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 2 Apr 2014 13:48:27 +0200 Subject: [PATCH] use defined_names also for modules, fixes symbol browsing issues - fixes #344 --- jedi/api/classes.py | 15 ++++++++------- jedi/evaluate/compiled/__init__.py | 18 +++++------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/jedi/api/classes.py b/jedi/api/classes.py index c8d00073..651dd553 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -4,6 +4,7 @@ These classes are the much bigger part of the whole API, because they contain the interesting information about completion and goto operations. """ import warnings +from itertools import chain from jedi._compatibility import next, unicode, use_metaclass from jedi import settings @@ -523,7 +524,7 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)): if isinstance(d, er.InstanceElement): d = d.var - if isinstance(d, compiled.CompiledObject): + if isinstance(d, (compiled.CompiledObject, compiled.CompiledName)): name = d.name elif isinstance(d, pr.Name): name = d.names[-1] @@ -624,12 +625,12 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)): :rtype: list of Definition """ - d = self._definition - if isinstance(d, er.InstanceElement): - d = d.var - if isinstance(d, pr.Name): - d = d.parent - return defined_names(self._evaluator, d) + defs = self._follow_statements_imports() + # For now we don't want base classes or evaluate decorators. + defs = [d.base if isinstance(d, (er.Class, er.Function)) else d for d in defs] + iterable = (defined_names(self._evaluator, d) for d in defs) + iterable = list(iterable) + return list(chain.from_iterable(iterable)) class CallSignature(Definition): diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index 33b95b73..8cd6a5e7 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -143,18 +143,13 @@ class CompiledObject(Base): return hasattr(self.obj, '__call__') -class CompiledName(object): +class CompiledName(FakeName): def __init__(self, obj, name): + super(CompiledName, self).__init__(name) self._obj = obj self.name = name self.start_pos = 0, 0 # an illegal start_pos, to make sorting easy. - def get_parent_until(self): - return self.parent.get_parent_until() - - def __str__(self): - return self.name - def __repr__(self): return '<%s: (%s).%s>' % (type(self).__name__, self._obj.name, self.name) @@ -164,12 +159,9 @@ class CompiledName(object): module = self._obj.get_parent_until() return _create_from_name(module, self._obj, self.name) - @property - def names(self): - return [self.name] # compatibility with parser.representation.Name - - def get_code(self): - return self.name + @parent.setter + def parent(self, value): + pass # Just ignore this, FakeName tries to overwrite the parent attribute. def load_module(path, name):