diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingModuleMembersProvider.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingModuleMembersProvider.java new file mode 100644 index 000000000000..90869d3c7318 --- /dev/null +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyOverridingModuleMembersProvider.java @@ -0,0 +1,7 @@ +package com.jetbrains.python.psi.types; + +/** + * @author vlan + */ +public abstract class PyOverridingModuleMembersProvider extends PyModuleMembersProvider { +} diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 6d42becec05c..4ccec4fa8234 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -63,11 +63,9 @@ public class PyModuleType implements PyType { // Modules don't descend from obje @Nullable PyExpression location, @NotNull AccessDirection direction, @NotNull PyResolveContext resolveContext) { - for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { - final PsiElement element = provider.resolveMember(myModule, name); - if (element != null) { - return ResolveResultList.to(element); - } + final PsiElement overridingMember = resolveByOverridingMembersProviders(myModule, name); + if (overridingMember != null) { + return ResolveResultList.to(overridingMember); } final PsiElement attribute = myModule.getElementNamed(name); if (attribute != null) { @@ -95,6 +93,36 @@ public class PyModuleType implements PyType { // Modules don't descend from obje return implicitMembers; } } + final PsiElement member = resolveByMembersProviders(myModule, name); + if (member != null) { + return ResolveResultList.to(member); + } + return null; + } + + @Nullable + private static PsiElement resolveByMembersProviders(PyFile module, String name) { + for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { + if (!(provider instanceof PyOverridingModuleMembersProvider)) { + final PsiElement element = provider.resolveMember(module, name); + if (element != null) { + return element; + } + } + } + return null; + } + + @Nullable + private static PsiElement resolveByOverridingMembersProviders(@NotNull PyFile module, @NotNull String name) { + for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { + if (provider instanceof PyOverridingModuleMembersProvider) { + final PsiElement element = provider.resolveMember(module, name); + if (element != null) { + return element; + } + } + } return null; }