From 5be8da029affcb723c3fca025745522e4679b56e Mon Sep 17 00:00:00 2001 From: fitermay Date: Mon, 19 Feb 2018 18:04:53 -0500 Subject: [PATCH] PY-28562: Add implicit `object` super when class has new style metaclass --- .../com/jetbrains/python/psi/impl/PyClassImpl.java | 2 +- .../resolve/SuperMetaClassInheritsObject.py | 13 +++++++++++++ .../testSrc/com/jetbrains/python/PyResolveTest.java | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 python/testData/resolve/SuperMetaClassInheritsObject.py diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java index 75291f095f28..0f8168fa84ef 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java @@ -1420,7 +1420,7 @@ public class PyClassImpl extends PyBaseElementImpl implements PyCla return null; } - if (LanguageLevel.forElement(this).isPython2() && getMetaClassQName() == null) { + if (LanguageLevel.forElement(this).isPython2() && getMetaClassQName() == null && !hasNewStyleMetaClass(this)) { final QualifiedName typesInstanceTypeQName = QualifiedName.fromDottedString(PyNames.TYPES_INSTANCE_TYPE); final PsiElement typesInstanceType = resolveTopLevelMember(typesInstanceTypeQName, fromFoothold(this)); diff --git a/python/testData/resolve/SuperMetaClassInheritsObject.py b/python/testData/resolve/SuperMetaClassInheritsObject.py new file mode 100644 index 000000000000..fa0253a5765d --- /dev/null +++ b/python/testData/resolve/SuperMetaClassInheritsObject.py @@ -0,0 +1,13 @@ +__metaclass__ = type + +class A: + def foo(self): + print "foo" + +class B(A): + def foo(self): + super(B, self).foo() + + +B().__getattribute__ +# \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyResolveTest.java b/python/testSrc/com/jetbrains/python/PyResolveTest.java index 643ec5da83af..4a217efc30c9 100644 --- a/python/testSrc/com/jetbrains/python/PyResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyResolveTest.java @@ -376,6 +376,12 @@ public class PyResolveTest extends PyResolveTestCase { assertResolvesTo(PyFunction.class, "foo"); } + //PY-28562 + public void testSuperMetaClassInheritsObject() { + assertResolvesTo(PyFunction.class, "__getattribute__"); + } + + public void testSuperDunderClass() { // PY-1190 assertResolvesTo(PyFunction.class, "foo"); }