From cb65a7a44be601f92d576f04e702cc40bab1a8d6 Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Mon, 28 Nov 2016 16:14:05 +0300 Subject: [PATCH] Forget to filter metaclass attributes by name while resolving class type member. This bug was introduced in PY-19702-related changes. --- .../jetbrains/python/psi/types/PyClassTypeImpl.java | 8 ++++++-- .../nonexistentMetaclassAttribute.py | 10 ++++++++++ .../Py3UnresolvedReferencesInspectionTest.java | 5 +++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection3K/nonexistentMetaclassAttribute.py diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index 1fa26e2e302d..e25943aaa1c0 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -48,6 +48,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.stream.Collectors; /** * @author yole @@ -310,8 +311,11 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { final List typeInstanceAttributes = ((PyClassType)typeType).getPyClass().getInstanceAttributes(); if (!ContainerUtil.isEmpty(typeInstanceAttributes)) { - return ContainerUtil - .map(typeInstanceAttributes, member -> new RatedResolveResult(PyReferenceImpl.getRate(member, context), member)); + return typeInstanceAttributes + .stream() + .filter(member -> name.equals(member.getName())) + .map(member -> new RatedResolveResult(PyReferenceImpl.getRate(member, context), member)) + .collect(Collectors.toList()); } } diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection3K/nonexistentMetaclassAttribute.py b/python/testData/inspections/PyUnresolvedReferencesInspection3K/nonexistentMetaclassAttribute.py new file mode 100644 index 000000000000..210603a30141 --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection3K/nonexistentMetaclassAttribute.py @@ -0,0 +1,10 @@ +class Meta(type): + def __new__(cls, name, bases, attrs): + foo = "abc" + + +class A(metaclass=Meta): + pass + + +print(A().bar) diff --git a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java index a864796fe868..3b707ae9c67c 100644 --- a/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/Py3UnresolvedReferencesInspectionTest.java @@ -100,6 +100,11 @@ public class Py3UnresolvedReferencesInspectionTest extends PyTestCase { doTest(); } + // PY-19702 + public void testNonexistentMetaclassAttribute() { + doTest(); + } + public void testMetaclassStub() { doMultiFileTest("a.py"); final Project project = myFixture.getProject();