From 2b958eca67d85c075dd29c643ec1f2dcb78da9e2 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 19 Nov 2014 20:35:57 +0300 Subject: [PATCH] Don't resolve attributes of metaclasses on instances of their instances --- .../python/psi/types/PyClassTypeImpl.java | 3 +++ .../metaClassMembers.py | 16 ++++++++++++++++ .../PyUnresolvedReferencesInspectionTest.java | 4 ++++ 3 files changed, 23 insertions(+) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection/metaClassMembers.py diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index 2e3f19451dff..25de66311ee1 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -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); diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/metaClassMembers.py b/python/testData/inspections/PyUnresolvedReferencesInspection/metaClassMembers.py new file mode 100644 index 000000000000..fe4cb2b00040 --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/metaClassMembers.py @@ -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['baz']) diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 530f3c8bd4c5..35097e0ea6c3 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -431,6 +431,10 @@ public class PyUnresolvedReferencesInspectionTest extends PyInspectionTestCase { assertTrue(JDOMUtil.writeElement(serialized).contains("foo.Bar.*")); } + public void testMetaClassMembers() { + doTest(); + } + @NotNull @Override protected Class getInspectionClass() {