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.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);
|
||||||
|
|||||||
+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.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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user