From 0f318a60f5df628a5fdb5ac12ccc5b2b7e6d6d88 Mon Sep 17 00:00:00 2001 From: "Ilya.Kazakevich" Date: Mon, 4 Dec 2017 20:41:56 +0300 Subject: [PATCH] PY-27241 + improvements: do not check ancestors in classMemberProvider ClassMemberProvider should not access ancestors, it should be done by getMembers client. --- .../psi/types/PyClassMembersProviderBase.java | 4 ++++ .../PyUnresolvedReferencesInspection.java | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProviderBase.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProviderBase.java index 95643be6b317..93f160771b35 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProviderBase.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProviderBase.java @@ -15,6 +15,10 @@ import java.util.Collections; * @author yole */ public class PyClassMembersProviderBase implements PyClassMembersProvider { + + /** + * Get members for this class type only: no need to read its ancestors since it is duty of this method client + */ @NotNull @Override public Collection getMembers(PyClassType clazz, PsiElement location, @NotNull TypeEvalContext context) { diff --git a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java index 3965b26be0b5..8089d3fe429f 100644 --- a/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/unresolvedReference/PyUnresolvedReferencesInspection.java @@ -1,6 +1,7 @@ // Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.jetbrains.python.inspections.unresolvedReference; +import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.intellij.codeInsight.controlflow.ControlFlow; @@ -824,12 +825,20 @@ public class PyUnresolvedReferencesInspection extends PyInspection { private static boolean hasUnresolvedDynamicMember(@NotNull final PyClassType type, PsiReference reference, @NotNull final String name, TypeEvalContext typeEvalContext) { - for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { - final Collection resolveResult = provider.getMembers(type, reference.getElement(), typeEvalContext); - for (PyCustomMember member : resolveResult) { - if (member.getName().equals(name)) return true; + + final List types = new ArrayList<>(Collections.singletonList(type)); + types.addAll(FluentIterable.from(type.getAncestorTypes(typeEvalContext)).filter(PyClassType.class).toList()); + + + for (final PyClassType typeToCheck : types) { + for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { + final Collection resolveResult = provider.getMembers(typeToCheck, reference.getElement(), typeEvalContext); + for (PyCustomMember member : resolveResult) { + if (member.getName().equals(name)) return true; + } } } + return false; }