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