From 3c92d175dae9d72aaa4793d324b703400a6cf2d8 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 30 Jul 2014 11:27:27 +0200 Subject: [PATCH] using super() in actual executed classes wasn't possible. fixes #421 --- jedi/evaluate/representation.py | 2 +- jedi/evaluate/stdlib.py | 10 ++++++---- test/completion/classes.py | 9 +++++++++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index e491d4dc..3056e55d 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -176,7 +176,7 @@ class Instance(use_metaclass(CachedMetaClass, Executable)): def __getattr__(self, name): if name not in ['start_pos', 'end_pos', 'name', 'get_imports', - 'doc', 'raw_doc', 'asserts']: + 'doc', 'raw_doc', 'asserts', 'py_bases']: raise AttributeError("Instance %s: Don't touch this (%s)!" % (self, name)) return getattr(self.base, name) diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index b3ed5d98..99a0939d 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -91,13 +91,15 @@ class SuperInstance(er.Instance): def builtins_super(evaluator, obj, params): # TODO make this able to detect multiple inheritance super - accept = (pr.Function,) + accept = (pr.Function, er.FunctionExecution) func = params.get_parent_until(accept) if func.isinstance(*accept): - cls = func.get_parent_until(accept + (pr.Class,), + wanted = (pr.Class, er.Instance) + cls = func.get_parent_until(accept + wanted, include_current=False) - if isinstance(cls, pr.Class): - cls = er.Class(evaluator, cls) + if isinstance(cls, wanted): + if isinstance(cls, pr.Class): + cls = er.Class(evaluator, cls) su = cls.py_bases() if su: return evaluator.execute(su[0]) diff --git a/test/completion/classes.py b/test/completion/classes.py index 0aa4cf91..2f4f7131 100644 --- a/test/completion/classes.py +++ b/test/completion/classes.py @@ -398,6 +398,8 @@ PrivateVar().__var # ----------------- class Super(object): a = 3 + def return_sup(self): + return 1 class TestSuper(Super): #? @@ -414,6 +416,13 @@ class TestSuper(Super): #? super() + def return_sup(self): + #? int() + return super().return_sup() + +#? int() +TestSuper().return_sup() + # ----------------- # if flow at class level