package org.jetbrains.plugins.clojure.gotoclass;
import com.intellij.navigation.ChooseByNameContributor;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.Project;
import com.intellij.psi.stubs.StubIndex;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.PsiClass;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.Function;
import java.util.Collection;
import java.util.List;
import org.jetbrains.plugins.clojure.psi.stubs.index.ClojureClassNameIndex;
import org.jetbrains.plugins.clojure.psi.api.ClojureFile;
import org.jetbrains.plugins.clojure.compiler.ClojureCompilerSettings;
/**
* @author ilyas
*/
public class ClojureGoToClassContributor implements ChooseByNameContributor {
public String[] getNames(Project project, boolean includeNonProjectItems) {
if (!ClojureCompilerSettings.getInstance(project).getState().COMPILE_CLOJURE) return new String[0];
final Collection<String> classNames = StubIndex.getInstance().getAllKeys(ClojureClassNameIndex.KEY, project);
return classNames.toArray(new String[classNames.size()]);
}
public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) {
if (!ClojureCompilerSettings.getInstance(project).getState().COMPILE_CLOJURE) return NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY;
final GlobalSearchScope scope = includeNonProjectItems ? null : GlobalSearchScope.projectScope(project);
Collection<ClojureFile> files = StubIndex.getInstance().get(ClojureClassNameIndex.KEY, name, project, scope);
List<PsiClass> scriptClasses = ContainerUtil.map(files, new Function<ClojureFile, PsiClass>() {
public PsiClass fun(ClojureFile clojureFile) {
assert clojureFile.isClassDefiningFile();
return clojureFile.getDefinedClass();
}
});
return scriptClasses.toArray(new NavigationItem[scriptClasses.size()]);
}
}