diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index 69c5391700b6..9d40ed94d606 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -28,7 +28,6 @@ import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiInvalidElementAccessException; -import com.intellij.psi.PsiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; @@ -594,33 +593,25 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { ProcessingContext context, List ret, @NotNull TypeEvalContext typeEvalContext) { - for (PyExpression expression : myClass.getSuperClassExpressions()) { - final PsiReference reference = expression.getReference(); - PsiElement element = null; - if (reference != null) { - element = reference.resolve(); + for (PyType type : myClass.getSuperClassTypes(typeEvalContext)) { + if (!(type instanceof PyClassLikeType)) { + continue; } - PyType type; - if (element instanceof PyClass) { - type = new PyClassTypeImpl((PyClass)element, myIsDefinition); + + final PyClassLikeType classLikeType = (PyClassLikeType)type; + if (classLikeType.isDefinition() && !myIsDefinition) { + type = classLikeType.toInstance(); } - else { - type = typeEvalContext.getType(expression); - if (type instanceof PyClassType && !myIsDefinition) { - type = ((PyClassType)type).toInstance(); + + Object[] ancestry = type.getCompletionVariants(name, expressionHook, context); + for (Object ob : ancestry) { + String inheritedName = ob.toString(); + if (!namesAlready.contains(inheritedName) && !isClassPrivate(inheritedName)) { + ret.add(ob); + namesAlready.add(inheritedName); } } - if (type != null) { - Object[] ancestry = type.getCompletionVariants(name, expressionHook, context); - for (Object ob : ancestry) { - String inheritedName = ob.toString(); - if (!namesAlready.contains(inheritedName) && !isClassPrivate(inheritedName)) { - ret.add(ob); - namesAlready.add(inheritedName); - } - } - ContainerUtil.addAll(ret, ancestry); - } + ContainerUtil.addAll(ret, ancestry); } } diff --git a/python/testData/completion/pySixTest.after.py b/python/testData/completion/pySixTest.after.py new file mode 100644 index 000000000000..044a63551e46 --- /dev/null +++ b/python/testData/completion/pySixTest.after.py @@ -0,0 +1,15 @@ +import six + +class MyType(type): + pass + +class Parent(object): + def parent(self): + pass + + +class Child(six.with_metaclass(MyType, Parent)): + pass + + +Child().parent() \ No newline at end of file diff --git a/python/testData/completion/pySixTest.py b/python/testData/completion/pySixTest.py new file mode 100644 index 000000000000..b759f1447e73 --- /dev/null +++ b/python/testData/completion/pySixTest.py @@ -0,0 +1,15 @@ +import six + +class MyType(type): + pass + +class Parent(object): + def parent(self): + pass + + +class Child(six.with_metaclass(MyType, Parent)): + pass + + +Child().paren \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index c71977c4c770..3cdc10ee36e7 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -178,6 +178,10 @@ public class PythonCompletionTest extends PyTestCase { doTest(); } + public void testPySixTest() { + doTest(); + } + public void testSeenMembers() { // PY-1181 final String testName = getTestName(true); myFixture.configureByFile(testName + ".py");