Resolve module members by providers only if resolve failed

This commit is contained in:
Andrey Vlasovskikh
2013-05-21 12:41:53 +04:00
parent 504e76c287
commit e563ecd8a6
2 changed files with 40 additions and 5 deletions
@@ -0,0 +1,7 @@
package com.jetbrains.python.psi.types;
/**
* @author vlan
*/
public abstract class PyOverridingModuleMembersProvider extends PyModuleMembersProvider {
}
@@ -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;
}