Optimize searching for kotlin classes
This commit is contained in:
@@ -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);
|
||||
|
||||
+7
-8
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user