Optimize searching for kotlin classes

This commit is contained in:
Nikolay Krasko
2013-06-21 19:42:56 +04:00
parent 7f1f2aa641
commit 69dffe8358
3 changed files with 24 additions and 24 deletions
@@ -21,9 +21,13 @@ import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.PsiShortNamesCache;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.psi.JetNamedDeclaration;
import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.stubindex.JetShortClassNameIndex;
@@ -54,17 +58,21 @@ public class JetGotoClassContributor implements GotoClassContributor {
@NotNull
@Override
public String[] getNames(Project project, boolean includeNonProjectItems) {
return JetShortNamesCache.getKotlinInstance(project).getAllClassNames();
return ArrayUtil.toObjectArray(JetShortClassNameIndex.getInstance().getAllKeys(project), String.class);
}
@NotNull
@Override
public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) {
GlobalSearchScope scope = GlobalSearchScope.allScope(project);
PsiClass[] classes = JetShortNamesCache.getKotlinInstance(project).getClassesByName(name, scope);
GlobalSearchScope scope = includeNonProjectItems ? GlobalSearchScope.allScope(project) : GlobalSearchScope.projectScope(project);
Collection<JetClassOrObject> classesOrObjects = JetShortClassNameIndex.getInstance().get(name, project, scope);
if (classesOrObjects.isEmpty()) {
return NavigationItem.EMPTY_NAVIGATION_ITEM_ARRAY;
}
PsiClass[] classes = PsiShortNamesCache.getInstance(project).getClassesByName(name, scope);
Collection<String> javaQualifiedNames = new HashSet<String>();
for (PsiClass aClass : classes) {
String qualifiedName = aClass.getQualifiedName();
if (qualifiedName != null) {
@@ -73,23 +81,16 @@ public class JetGotoClassContributor implements GotoClassContributor {
}
List<NavigationItem> items = new ArrayList<NavigationItem>();
Collection<JetClassOrObject> classesOrObjects = JetShortClassNameIndex.getInstance().get(name, project, scope);
for (JetClassOrObject classOrObject : classesOrObjects) {
FqName fqName = JetPsiUtil.getFQName(classOrObject);
if (fqName == null || javaQualifiedNames.contains(fqName.toString())) {
// Elements will be added by Java class contributor
continue;
}
if (classOrObject instanceof JetObjectDeclaration) {
// items.add((JetObjectDeclaration) classOrObject);
}
else if (classOrObject instanceof JetClass) {
if (classOrObject instanceof JetClass) {
items.add(classOrObject);
}
else {
assert false;
}
}
return ArrayUtil.toObjectArray(items, NavigationItem.class);
@@ -86,7 +86,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
// .namespace classes can not be indexed, since they have no explicit declarations
IDELightClassGenerationSupport lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project);
Set<String> packageClassShortNames = lightClassGenerationSupport.getAllPackageClasses(GlobalSearchScope.allScope(project)).keySet();
Set<String> packageClassShortNames = lightClassGenerationSupport.getAllPossiblePackageClasses(GlobalSearchScope.allScope(project)).keySet();
classNames.addAll(packageClassShortNames);
return ArrayUtil.toStringArray(classNames);
@@ -101,7 +101,7 @@ public class JetShortNamesCache extends PsiShortNamesCache {
List<PsiClass> result = new ArrayList<PsiClass>();
IDELightClassGenerationSupport lightClassGenerationSupport = IDELightClassGenerationSupport.getInstanceForIDE(project);
MultiMap<String, FqName> packageClasses = lightClassGenerationSupport.getAllPackageClasses(scope);
MultiMap<String, FqName> packageClasses = lightClassGenerationSupport.getAllPossiblePackageClasses(scope);
// .namespace classes can not be indexed, since they have no explicit declarations
Collection<FqName> fqNames = packageClasses.get(name);
@@ -37,7 +37,9 @@ import org.jetbrains.jet.lang.psi.JetPsiUtil;
import org.jetbrains.jet.lang.resolve.java.PackageClassUtils;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.plugin.libraries.JetSourceNavigationHelper;
import org.jetbrains.jet.plugin.stubindex.*;
import org.jetbrains.jet.plugin.stubindex.JetAllPackagesIndex;
import org.jetbrains.jet.plugin.stubindex.JetClassByPackageIndex;
import org.jetbrains.jet.plugin.stubindex.JetFullClassNameIndex;
import org.jetbrains.jet.util.QualifiedNamesUtil;
import java.util.Collection;
@@ -131,18 +133,15 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport
}
@NotNull
public MultiMap<String, FqName> getAllPackageClasses(@NotNull GlobalSearchScope scope) {
public MultiMap<String, FqName> getAllPossiblePackageClasses(@NotNull GlobalSearchScope scope) {
Collection<String> packageFqNames = JetAllPackagesIndex.getInstance().getAllKeys(project);
MultiMap<String, FqName> result = new MultiMap<String, FqName>();
for (String packageFqName : packageFqNames) {
Collection<JetFile> files = findFilesForPackage(new FqName(packageFqName), scope);
if (!files.isEmpty()) {
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(new FqName(packageFqName));
result.putValue(packageClassFqName.shortName().asString(), packageClassFqName);
}
FqName packageClassFqName = PackageClassUtils.getPackageClassFqName(new FqName(packageFqName));
result.putValue(packageClassFqName.shortName().asString(), packageClassFqName);
}
return result;
}
}