Reimplement "Find Usages" using KotlinClassInheritorsSearch

This commit is contained in:
Alexey Sedunov
2013-12-05 16:50:14 +04:00
parent 39211e4759
commit 1095c51d6a
@@ -21,13 +21,11 @@ import com.intellij.find.findUsages.FindUsagesOptions;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.PsiClass; import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReference;
import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.search.PsiElementProcessorAdapter; import com.intellij.psi.search.PsiElementProcessorAdapter;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.usageView.UsageInfo; import com.intellij.usageView.UsageInfo;
import com.intellij.util.Processor; import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -38,6 +36,9 @@ import org.jetbrains.jet.plugin.findUsages.FindUsagesPackage;
import org.jetbrains.jet.plugin.findUsages.KotlinClassFindUsagesOptions; import org.jetbrains.jet.plugin.findUsages.KotlinClassFindUsagesOptions;
import org.jetbrains.jet.plugin.findUsages.KotlinFindUsagesHandlerFactory; import org.jetbrains.jet.plugin.findUsages.KotlinFindUsagesHandlerFactory;
import org.jetbrains.jet.plugin.findUsages.dialogs.KotlinFindClassUsagesDialog; import org.jetbrains.jet.plugin.findUsages.dialogs.KotlinFindClassUsagesDialog;
import org.jetbrains.jet.plugin.search.declarationsSearch.DeclarationsSearchPackage;
import org.jetbrains.jet.plugin.search.declarationsSearch.HierarchySearchRequest;
import org.jetbrains.jet.plugin.search.declarationsSearch.KotlinClassInheritorsSearch;
import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearch; import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearch;
import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchRequest; import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchRequest;
import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchTarget; import org.jetbrains.jet.plugin.search.usagesSearch.UsagesSearchTarget;
@@ -84,10 +85,7 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler<JetCla
processUsage(processor, ref); processUsage(processor, ref);
} }
PsiClass lightClass = LightClassUtil.getPsiClass(classOrObject); if (!processInheritors(classOrObject, processor, kotlinOptions)) return false;
if (lightClass == null) return true;
if (!processInheritors(lightClass, processor, kotlinOptions)) return false;
return true; return true;
} }
@@ -95,31 +93,25 @@ public class KotlinFindClassUsagesHandler extends KotlinFindUsagesHandler<JetCla
); );
} }
private static final ClassInheritorsSearch.InheritanceChecker INHERITANCE_CHECKER = new ClassInheritorsSearch.InheritanceChecker() {
@Override
public boolean checkInheritance(@NotNull PsiClass subClass, @NotNull PsiClass parentClass) {
return true;
}
};
private static boolean processInheritors( private static boolean processInheritors(
@NotNull PsiClass klass, @NotNull JetClassOrObject classOrObject,
@NotNull final Processor<UsageInfo> processor, @NotNull final Processor<UsageInfo> processor,
@NotNull final KotlinClassFindUsagesOptions options @NotNull final KotlinClassFindUsagesOptions options
) { ) {
//noinspection unchecked HierarchySearchRequest<PsiElement> request = new HierarchySearchRequest<PsiElement>(
ClassInheritorsSearch.SearchParameters searchParameters = new ClassInheritorsSearch.SearchParameters( classOrObject, options.searchScope, options.isCheckDeepInheritance
klass, options.searchScope, options.isCheckDeepInheritance, true, true, Condition.TRUE, INHERITANCE_CHECKER
); );
return ClassInheritorsSearch.search(searchParameters).forEach( return KotlinClassInheritorsSearch.instance$.search(request).forEach(
new PsiElementProcessorAdapter<PsiClass>( new PsiElementProcessorAdapter<PsiElement>(
new PsiElementProcessor<PsiClass>() { new PsiElementProcessor<PsiElement>() {
@Override @Override
public boolean execute(@NotNull PsiClass element) { public boolean execute(@NotNull PsiElement element) {
if ((element.isInterface() && options.isDerivedInterfaces) boolean traitOrInterface = DeclarationsSearchPackage.isTraitOrInterface(element);
|| (!element.isInterface() && options.isDerivedClasses)) {
if ((traitOrInterface && options.isDerivedInterfaces) || (!traitOrInterface && options.isDerivedClasses)) {
return processUsage(processor, element); return processUsage(processor, element);
} }
return true; return true;
} }
} }