diff --git a/python/psi-api/src/com/jetbrains/python/psi/PyClassRef.java b/python/psi-api/src/com/jetbrains/python/psi/PyClassRef.java index 992600f5c62e..7ac54083264f 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/PyClassRef.java +++ b/python/psi-api/src/com/jetbrains/python/psi/PyClassRef.java @@ -14,12 +14,12 @@ public class PyClassRef { @Nullable private final String myQName; - public PyClassRef(PsiElement element) { + public PyClassRef(@Nullable PsiElement element) { myElement = element; myQName = null; } - public PyClassRef(String qName) { + public PyClassRef(@Nullable String qName) { myElement = null; myQName = qName; } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java index a270bee771f1..60e8ae5e2049 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyClassElementType.java @@ -42,13 +42,20 @@ public class PyClassElementType extends PyStubElementType public PyClassStub createStub(@NotNull final PyClass psi, final StubElement parentStub) { final PyExpression[] exprs = psi.getSuperClassExpressions(); List superClasses = new ArrayList(); - for (final PyExpression expression : exprs) { + for (PyExpression expression : exprs) { + if (expression instanceof PyCallExpression) { + PyCallExpression call = (PyCallExpression)expression; + //noinspection ConstantConditions + if (call.getCallee() != null && "with_metaclass".equals(call.getCallee().getName()) && call.getArguments().length > 1) { + expression = call.getArguments()[1]; + } + } superClasses.add(PyQualifiedName.fromExpression(expression)); } final PyStringLiteralExpression docStringExpression = psi.getDocStringExpression(); return new PyClassStubImpl(psi.getName(), parentStub, superClasses.toArray(new PyQualifiedName[superClasses.size()]), - ((PyClassImpl) psi).getOwnSlots(), + ((PyClassImpl)psi).getOwnSlots(), PyPsiUtils.strValue(docStringExpression), getStubElementType()); } @@ -57,7 +64,7 @@ public class PyClassElementType extends PyStubElementType dataStream.writeName(pyClassStub.getName()); final PyQualifiedName[] classes = pyClassStub.getSuperClasses(); dataStream.writeByte(classes.length); - for(PyQualifiedName s: classes) { + for (PyQualifiedName s : classes) { PyQualifiedName.serialize(s, dataStream); } PyFileElementType.writeNullableList(dataStream, pyClassStub.getSlots()); @@ -69,7 +76,7 @@ public class PyClassElementType extends PyStubElementType String name = StringRef.toString(dataStream.readName()); int superClassCount = dataStream.readByte(); PyQualifiedName[] superClasses = new PyQualifiedName[superClassCount]; - for(int i=0; i slots = PyFileElementType.readNullableList(dataStream); @@ -83,7 +90,7 @@ public class PyClassElementType extends PyStubElementType sink.occurrence(PyClassNameIndex.KEY, name); sink.occurrence(PyClassNameIndexInsensitive.KEY, name.toLowerCase()); } - for(PyQualifiedName s: stub.getSuperClasses()) { + for (PyQualifiedName s : stub.getSuperClasses()) { if (s != null) { String className = s.getLastComponent(); if (className != null) {