deep search for inheritors in python

This commit is contained in:
Dmitry Jemerov
2008-03-24 17:49:07 +03:00
parent dc5a91cf12
commit 495fb1b43e
5 changed files with 39 additions and 9 deletions

View File

@@ -12,22 +12,28 @@ public class PyClassInheritorsSearch extends ExtensibleQueryFactory<PyClass, PyC
public static class SearchParameters {
private PyClass mySuperClass;
private boolean myCheckDeepInheritance;
public SearchParameters(final PyClass superClass) {
public SearchParameters(final PyClass superClass, final boolean checkDeepInheritance) {
mySuperClass = superClass;
myCheckDeepInheritance = checkDeepInheritance;
}
public PyClass getSuperClass() {
return mySuperClass;
}
public boolean isCheckDeepInheritance() {
return myCheckDeepInheritance;
}
}
private PyClassInheritorsSearch() {
super("Pythonid");
}
public static Query<PyClass> search(final PyClass superClass) {
final SearchParameters parameters = new SearchParameters(superClass);
public static Query<PyClass> search(final PyClass superClass, final boolean checkDeepInheritance) {
final SearchParameters parameters = new SearchParameters(superClass, checkDeepInheritance);
return INSTANCE.createUniqueResultsQuery(parameters);
}
}

View File

@@ -5,17 +5,26 @@ import com.intellij.psi.search.ProjectScope;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import com.intellij.util.containers.HashSet;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.stubs.PySuperClassIndex;
import java.util.Collection;
import java.util.Set;
/**
* @author yole
*/
public class PyClassInheritorsSearchExecutor implements QueryExecutor<PyClass, PyClassInheritorsSearch.SearchParameters> {
public boolean execute(final PyClassInheritorsSearch.SearchParameters queryParameters, final Processor<PyClass> consumer) {
PyClass superClass = queryParameters.getSuperClass();
Set<PyClass> processed = new HashSet<PyClass>();
return processDirectInheritors(queryParameters.getSuperClass(), consumer, queryParameters.isCheckDeepInheritance(), processed);
}
private static boolean processDirectInheritors(final PyClass superClass, final Processor<PyClass> consumer, final boolean checkDeep,
final Set<PyClass> processed) {
if (processed.contains(superClass)) return true;
processed.add(superClass);
Project project = superClass.getProject();
final Collection<PyClass> candidates = StubIndex.getInstance().get(PySuperClassIndex.KEY, superClass.getName(), project,
ProjectScope.getAllScope(project));
@@ -27,13 +36,12 @@ public class PyClassInheritorsSearchExecutor implements QueryExecutor<PyClass, P
if (!consumer.process(candidate)) {
return false;
}
else {
if (checkDeep && !processDirectInheritors(candidate, consumer, checkDeep, processed)) return false;
break;
}
}
}
}
}
return true;
}
}

View File

@@ -12,7 +12,7 @@ import com.jetbrains.python.psi.PyClass;
public class PyDefinitionsSearch implements QueryExecutor<PsiElement, PsiElement> {
public boolean execute(final PsiElement queryParameters, final Processor<PsiElement> consumer) {
if (queryParameters instanceof PyClass) {
final Query<PyClass> query = PyClassInheritorsSearch.search((PyClass)queryParameters);
final Query<PyClass> query = PyClassInheritorsSearch.search((PyClass)queryParameters, true);
return query.forEach(new Processor<PyClass>() {
public boolean process(final PyClass pyClass) {
return consumer.process(pyClass);

View File

@@ -0,0 +1,9 @@
class A(object):
pass
class B(A):
pass
class C(B):
pass

View File

@@ -20,7 +20,14 @@ public class PyInheritorsSearchTest extends CodeInsightTestCase {
public void testSimple() throws Exception {
setupProject();
final PyClass pyClass = findClass("A");
Collection<PyClass> inheritors = PyClassInheritorsSearch.search(pyClass).findAll();
Collection<PyClass> inheritors = PyClassInheritorsSearch.search(pyClass, false).findAll();
assertEquals(2, inheritors.size());
}
public void testDeep() throws Exception {
setupProject();
final PyClass pyClass = findClass("A");
Collection<PyClass> inheritors = PyClassInheritorsSearch.search(pyClass, true).findAll();
assertEquals(2, inheritors.size());
}