mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 22:51:17 +07:00
deep search for inheritors in python
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
9
python/testData/inheritors/deep/A.py
Normal file
9
python/testData/inheritors/deep/A.py
Normal file
@@ -0,0 +1,9 @@
|
||||
class A(object):
|
||||
pass
|
||||
|
||||
class B(A):
|
||||
pass
|
||||
|
||||
class C(B):
|
||||
pass
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user