diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 34715f53..78b7063d 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -528,10 +528,6 @@ class Script(object): for d in set(definitions): if isinstance(d, (pr.Module, compiled.CompiledObject)): names.append(classes.Definition(self._evaluator, d)) - elif isinstance(d, er.Instance): - # Instances can be ignored, because they have been created by - # ``__getattr__``. - pass else: names.append(classes.Definition(self._evaluator, d.names[-1])) diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index c77fc312..f9e4e6bf 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -95,14 +95,6 @@ class NameFinder(object): if result: break - if not result and isinstance(self.scope, er.Instance): - # handling __getattr__ / __getattribute__ - for r in self._check_getattr(self.scope): - if not isinstance(r, compiled.CompiledObject): - new_name = copy.copy(r.name) - new_name.parent = r - result.append(new_name) - debug.dbg('finder.filter_name "%s" in (%s-%s): %s@%s', self.name_str, self.scope, nscope, u(result), self.position) return result @@ -197,6 +189,11 @@ class NameFinder(object): if typ.isinstance(er.Function) and resolve_decorator: typ = typ.get_decorated_func() types.append(typ) + + if not names and isinstance(self.scope, er.Instance): + # handling __getattr__ / __getattribute__ + types = self._check_getattr(self.scope) + return types def _remove_statements(self, stmt): diff --git a/test/completion/classes.py b/test/completion/classes.py index f9c9231b..cb7a801d 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -356,6 +356,14 @@ Wrapper(Base()).ret(3) #? int() Wrapper2(Base()).ret(3) +class GetattrArray(): + def __getattr__(self, name): + return [1] + +#? int() +GetattrArray().something[0] + + # ----------------- # private vars # -----------------