diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java index dd6b8c0eda59..672b37fffd0b 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassMembersProvider.java @@ -13,8 +13,8 @@ import java.util.Collection; public interface PyClassMembersProvider { ExtensionPointName EP_NAME = ExtensionPointName.create("Pythonid.pyClassMembersProvider"); - Collection getMembers(PyClassType clazz); + Collection getMembers(PyClassType clazz, @Nullable PsiElement location); @Nullable - PsiElement resolveMember(PyClassType clazz, String name); + PsiElement resolveMember(PyClassType clazz, String name, @Nullable PsiElement location); } 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 4420221c9d6e..ef91d4ef8ddb 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 @@ -13,13 +13,13 @@ import java.util.Collections; */ public class PyClassMembersProviderBase implements PyClassMembersProvider { @Override - public Collection getMembers(PyClassType clazz) { + public Collection getMembers(PyClassType clazz, PsiElement location) { return Collections.emptyList(); } @Override - public PsiElement resolveMember(PyClassType clazz, String name) { - final Collection members = getMembers(clazz); + public PsiElement resolveMember(PyClassType clazz, String name, PsiElement location) { + final Collection members = getMembers(clazz, location); return resolveMemberByName(members, clazz, name); } diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibClassMembersProvider.java b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibClassMembersProvider.java index e2576e7c8a4f..231ea319bb1d 100644 --- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibClassMembersProvider.java +++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyStdlibClassMembersProvider.java @@ -1,6 +1,7 @@ package com.jetbrains.python.codeInsight.stdlib; import com.intellij.openapi.util.Key; +import com.intellij.psi.PsiElement; import com.jetbrains.python.codeInsight.PyDynamicMember; import com.jetbrains.python.psi.PyClass; import com.jetbrains.python.psi.PyFile; @@ -21,7 +22,7 @@ public class PyStdlibClassMembersProvider extends PyClassMembersProviderBase { private Key> mySocketMembersKey = Key.create("socket.members"); @Override - public Collection getMembers(PyClassType classType) { + public Collection getMembers(PyClassType classType, PsiElement location) { PyClass clazz = classType.getPyClass(); final String qualifiedName = clazz.getQualifiedName(); if ("socket._socketobject".equals(qualifiedName)) { diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 71c0faac02a2..ac6a5cd69131 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -653,7 +653,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { if (isDecoratedAsDynamic(cls, true)) { return true; } - if (hasUnresolvedDynamicMember((PyClassType)qtype, refText)) return true; + if (hasUnresolvedDynamicMember((PyClassType)qtype, reference, refText)) return true; } if (qtype instanceof CythonBuiltinType || (qtype instanceof CythonType && reference instanceof PyOperatorReference)) { @@ -668,9 +668,11 @@ public class PyUnresolvedReferencesInspection extends PyInspection { return false; } - private static boolean hasUnresolvedDynamicMember(@NotNull final PyClassType qtype, @NotNull final String refText) { + private static boolean hasUnresolvedDynamicMember(@NotNull final PyClassType qtype, + PsiReference reference, + @NotNull final String refText) { for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { - final Collection resolveResult = provider.getMembers(qtype); + final Collection resolveResult = provider.getMembers(qtype, reference.getElement()); for (PyDynamicMember member : resolveResult) { if (member.getName().equals(refText)) return true; } diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index de9cc6b39c68..046bb1fac020 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -135,7 +135,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { @NotNull PyResolveContext resolveContext, boolean inherited) { final TypeEvalContext context = resolveContext.getTypeEvalContext(); - PsiElement classMember = resolveByOverridingMembersProviders(this, name); //overriding members provers have priority to normal resolve + PsiElement classMember = resolveByOverridingMembersProviders(this, name, location); //overriding members provers have priority to normal resolve if (classMember != null) { return ResolveResultList.to(classMember); } @@ -211,7 +211,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } if (inherited) { - classMember = resolveByMembersProviders(this, name); //ask providers after real class introspection as providers have less priority + classMember = resolveByMembersProviders(this, name, location); //ask providers after real class introspection as providers have less priority } if (classMember != null) { @@ -223,7 +223,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { if (type instanceof PyClassType) { final PyClass pyClass = ((PyClassType)type).getPyClass(); if (pyClass != null) { - PsiElement superMember = resolveByMembersProviders(new PyClassTypeImpl(pyClass, isDefinition()), name); + PsiElement superMember = resolveByMembersProviders(new PyClassTypeImpl(pyClass, isDefinition()), name, location); if (superMember != null) { return ResolveResultList.to(superMember); @@ -296,9 +296,9 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } @Nullable - private static PsiElement resolveByMembersProviders(PyClassType aClass, String name) { + private static PsiElement resolveByMembersProviders(PyClassType aClass, String name, @Nullable PsiElement location) { for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { - final PsiElement resolveResult = provider.resolveMember(aClass, name); + final PsiElement resolveResult = provider.resolveMember(aClass, name, location); if (resolveResult != null) return resolveResult; } @@ -306,10 +306,10 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } @Nullable - private static PsiElement resolveByOverridingMembersProviders(PyClassType aClass, String name) { + private static PsiElement resolveByOverridingMembersProviders(PyClassType aClass, String name, @Nullable PsiElement location) { for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { if (provider instanceof PyOverridingClassMembersProvider) { - final PsiElement resolveResult = provider.resolveMember(aClass, name); + final PsiElement resolveResult = provider.resolveMember(aClass, name, location); if (resolveResult != null) return resolveResult; } } @@ -361,7 +361,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { // from providers for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) { - for (PyDynamicMember member : provider.getMembers(this)) { + for (PyDynamicMember member : provider.getMembers(this, location)) { final String name = member.getName(); if (!namesAlready.contains(name)) { LookupElementBuilder lookupElementBuilder = LookupElementBuilder.create(name).withIcon(member.getIcon()).withTypeText(getName());