Merge branch 'python-fixes'

This commit is contained in:
Andrey Vlasovskikh
2014-11-19 20:39:25 +03:00
7 changed files with 46 additions and 4 deletions
@@ -1270,7 +1270,7 @@ public class PyClassImpl extends PyBaseElementImpl<PyClassStub> implements PyCla
else {
final PyTargetExpression attribute = findClassAttribute(PyNames.DUNDER_METACLASS, false);
if (attribute != null) {
return attribute;
return attribute.findAssignedValue();
}
}
return null;
@@ -196,6 +196,9 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
if (inherited) {
for (PyClassLikeType type : myClass.getAncestorTypes(context)) {
if (type instanceof PyClassType) {
if (!myIsDefinition) {
type = type.toInstance();
}
PsiElement superMember = resolveClassMember(((PyClassType)type).getPyClass(), myIsDefinition, name, null);
if (superMember != null) {
return ResolveResultList.to(superMember);
@@ -0,0 +1,10 @@
from b import Generic
class C(Generic['foo']):
pass
print(C['bar'])
c = C()
print(c<warning descr="Class 'C' does not define '__getitem__', so the '[]' operator cannot be used on its instances">[</warning>'baz'])
@@ -0,0 +1,9 @@
class GenericMeta(type):
def __getitem__(self, args):
pass
class Generic(object):
__metaclass__ = GenericMeta
@@ -0,0 +1,16 @@
class GenericMeta(type):
def __getitem__(self, args):
pass
class Generic(object):
__metaclass__ = GenericMeta
class C(Generic['foo']):
pass
print(C['bar'])
c = C()
print(c<warning descr="Class 'C' does not define '__getitem__', so the '[]' operator cannot be used on its instances">[</warning>'baz'])
@@ -418,11 +418,11 @@ public class PyStubsTest extends PyTestCase {
final PyFile file = getTestFile();
final PyClass c = file.findTopLevelClass("C");
assertNotNull(c);
assertNotNull(c.getMetaClassExpression());
final TypeEvalContext context = TypeEvalContext.codeInsightFallback(myFixture.getProject());
assertNotNull(c.getMetaClassType(context));
final PyClass d = file.findTopLevelClass("D");
assertNotNull(d);
assertNull(d.getMetaClassExpression());
assertNotNull(d.getMetaClassType(TypeEvalContext.codeInsightFallback(c.getProject())));
assertNotNull(d.getMetaClassType(context));
assertNotParsed(file);
}
}
@@ -431,6 +431,10 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase {
assertTrue(JDOMUtil.writeElement(serialized).contains("foo.Bar.*"));
}
public void testMetaClassMembers() {
doTest();
}
@NotNull
@Override
protected Class<? extends PyInspection> getInspectionClass() {