From 0b68aa1d4b45bf7dbeaf3230b43bb56f13cdad1b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 14 Sep 2012 16:15:39 +0400 Subject: [PATCH] cleanup, performance --- .../intellij/psi/NonClasspathClassFinder.java | 3 +- .../src/com/intellij/psi/JavaPsiFacade.java | 3 +- .../com/intellij/psi/PsiElementFinder.java | 6 +- .../intellij/psi/impl/JavaPsiFacadeEx.java | 3 +- .../intellij/psi/impl/JavaPsiFacadeImpl.java | 85 +++++++++++-------- 5 files changed, 60 insertions(+), 40 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/NonClasspathClassFinder.java b/java/java-impl/src/com/intellij/psi/NonClasspathClassFinder.java index 3d022a9f9fdf..17d937611b17 100644 --- a/java/java-impl/src/com/intellij/psi/NonClasspathClassFinder.java +++ b/java/java-impl/src/com/intellij/psi/NonClasspathClassFinder.java @@ -130,6 +130,7 @@ public abstract class NonClasspathClassFinder extends PsiElementFinder { } + @NotNull @Override public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { final List classRoots = getClassRoots(); @@ -177,7 +178,7 @@ public abstract class NonClasspathClassFinder extends PsiElementFinder { @Override public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, - Processor consumer) { + @NotNull Processor consumer) { final List classRoots = getClassRoots(); if (classRoots.isEmpty()) { return true; diff --git a/java/java-psi-api/src/com/intellij/psi/JavaPsiFacade.java b/java/java-psi-api/src/com/intellij/psi/JavaPsiFacade.java index b4313bebf566..3819fe5290b5 100644 --- a/java/java-psi-api/src/com/intellij/psi/JavaPsiFacade.java +++ b/java/java-psi-api/src/com/intellij/psi/JavaPsiFacade.java @@ -135,7 +135,7 @@ public abstract class JavaPsiFacade { * @param packageName the package name to check. * @return true if it is part of the package prefix, false otherwise. */ - public abstract boolean isPartOfPackagePrefix(String packageName); + public abstract boolean isPartOfPackagePrefix(@NotNull String packageName); /** * Checks if the specified PSI element belongs to the specified package. @@ -155,5 +155,6 @@ public abstract class JavaPsiFacade { */ public abstract boolean arePackagesTheSame(@NotNull PsiElement element1, @NotNull PsiElement element2); + @NotNull public abstract Project getProject(); } diff --git a/java/java-psi-api/src/com/intellij/psi/PsiElementFinder.java b/java/java-psi-api/src/com/intellij/psi/PsiElementFinder.java index 8488baaf0081..6bedfff48a42 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiElementFinder.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiElementFinder.java @@ -97,11 +97,13 @@ public abstract class PsiElementFinder { return PsiClass.EMPTY_ARRAY; } + @NotNull public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { return getClassNames(getClasses(psiPackage, scope)); } - protected static Set getClassNames(PsiClass[] classes) { + @NotNull + protected static Set getClassNames(@NotNull PsiClass[] classes) { if (classes.length == 0) { return Collections.emptySet(); } @@ -113,7 +115,7 @@ public abstract class PsiElementFinder { return names; } - public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, Processor consumer) { + public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, @NotNull Processor consumer) { return true; } } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java index 9553d44191d2..64d52091062b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeEx.java @@ -22,6 +22,7 @@ package com.intellij.psi.impl; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFileFilter; import com.intellij.psi.JavaPsiFacade; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.TestOnly; public abstract class JavaPsiFacadeEx extends JavaPsiFacade { @@ -30,5 +31,5 @@ public abstract class JavaPsiFacadeEx extends JavaPsiFacade { } @TestOnly - public abstract void setAssertOnFileLoadingFilter(final VirtualFileFilter filter); + public abstract void setAssertOnFileLoadingFilter(@NotNull VirtualFileFilter filter); } \ No newline at end of file diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java index 782b0978fc43..16cecad25dec 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/JavaPsiFacadeImpl.java @@ -34,7 +34,7 @@ import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiModificationTracker; -import com.intellij.psi.util.PsiUtil; +import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.ConcurrencyUtil; import com.intellij.util.Processor; import com.intellij.util.SmartList; @@ -43,6 +43,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import java.util.*; import java.util.concurrent.ConcurrentMap; @@ -51,7 +52,7 @@ import java.util.concurrent.ConcurrentMap; * @author max */ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { - private ArrayList myElementFinders; + private PsiElementFinder[] myElementFinders; //benign data race private final PsiNameHelper myNameHelper; private final PsiConstantEvaluationHelper myConstantEvaluationHelper; private final ConcurrentMap myPackageCache = new ConcurrentHashMap(); @@ -102,9 +103,9 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { ProgressIndicatorProvider.checkCanceled(); // We hope this method is being called often enough to cancel daemon processes smoothly if (DumbService.getInstance(getProject()).isDumb()) { - final List classes = findClassesInDumbMode(qualifiedName, scope); - if (!classes.isEmpty()) { - return classes.get(0); + PsiClass[] classes = findClassesInDumbMode(qualifiedName, scope); + if (classes.length != 0) { + return classes[0]; } return null; } @@ -118,42 +119,46 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { } @NotNull - private List findClassesInDumbMode(String qualifiedName, GlobalSearchScope scope) { + private PsiClass[] findClassesInDumbMode(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { final String packageName = StringUtil.getPackageName(qualifiedName); final PsiPackage pkg = findPackage(packageName); final String className = StringUtil.getShortName(qualifiedName); if (pkg == null && packageName.length() < qualifiedName.length()) { - final List containingClasses = findClassesInDumbMode(packageName, scope); - if (containingClasses.size() == 1) { - return filterByName(className, containingClasses.get(0).getInnerClasses()); + PsiClass[] containingClasses = findClassesInDumbMode(packageName, scope); + if (containingClasses.length == 1) { + return filterByName(className, containingClasses[0].getInnerClasses()); } - return Collections.emptyList(); + return PsiClass.EMPTY_ARRAY; } if (pkg == null || !pkg.containsClassNamed(className)) { - return Collections.emptyList(); + return PsiClass.EMPTY_ARRAY; } return filterByName(className, pkg.getClasses(scope)); } - private static List filterByName(String className, PsiClass[] classes) { - final List foundClasses = new SmartList(); + @NotNull + private static PsiClass[] filterByName(@NotNull String className, @NotNull PsiClass[] classes) { + if (classes.length == 0) return PsiClass.EMPTY_ARRAY; + if (classes.length == 1) { + return className.equals(classes[0].getName()) ? classes : PsiClass.EMPTY_ARRAY; + } + List foundClasses = new SmartList(); for (PsiClass psiClass : classes) { if (className.equals(psiClass.getName())) { foundClasses.add(psiClass); } } - return foundClasses; + return foundClasses.isEmpty() ? PsiClass.EMPTY_ARRAY : foundClasses.toArray(new PsiClass[foundClasses.size()]); } @Override @NotNull public PsiClass[] findClasses(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) { if (DumbService.getInstance(getProject()).isDumb()) { - final List classes = findClassesInDumbMode(qualifiedName, scope); - return classes.toArray(new PsiClass[classes.size()]); + return findClassesInDumbMode(qualifiedName, scope); } List classes = new SmartList(); @@ -165,8 +170,9 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return classes.toArray(new PsiClass[classes.size()]); } - private ArrayList finders() { - ArrayList answer = myElementFinders; + @NotNull + private PsiElementFinder[] finders() { + PsiElementFinder[] answer = myElementFinders; if (answer == null) { answer = calcFinders(); myElementFinders = answer; @@ -175,11 +181,12 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return answer; } - private ArrayList calcFinders() { - ArrayList elementFinders = new ArrayList(); + @NotNull + private PsiElementFinder[] calcFinders() { + List elementFinders = new ArrayList(); elementFinders.add(new PsiElementFinderImpl()); ContainerUtil.addAll(elementFinders, myProject.getExtensions(PsiElementFinder.EP_NAME)); - return elementFinders; + return elementFinders.toArray(new PsiElementFinder[elementFinders.size()]); } @Override @@ -205,16 +212,18 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return null; } - private List filteredFinders() { + @NotNull + private PsiElementFinder[] filteredFinders() { DumbService dumbService = DumbService.getInstance(getProject()); - List finders = finders(); + PsiElementFinder[] finders = finders(); if (dumbService.isDumb()) { - finders = dumbService.filterByDumbAwareness(finders); + List list = dumbService.filterByDumbAwareness(Arrays.asList(finders)); + finders = list.toArray(new PsiElementFinder[list.size()]); } return finders; } - @Override + @Override @NotNull public PsiJavaParserFacade getParserFacade() { return getElementFactory(); // TODO: lighter implementation which doesn't mark all the elements as generated. @@ -232,7 +241,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return myNameHelper; } - public Set getClassNames(PsiPackage psiPackage, GlobalSearchScope scope) { + @NotNull + public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { Set result = new HashSet(); for (PsiElementFinder finder : filteredFinders()) { result.addAll(finder.getClassNames(psiPackage, scope)); @@ -240,7 +250,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return result; } - public PsiClass[] getClasses(PsiPackage psiPackage, GlobalSearchScope scope) { + @NotNull + public PsiClass[] getClasses(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { List result = null; for (PsiElementFinder finder : filteredFinders()) { PsiClass[] classes = finder.getClasses(psiPackage, scope); @@ -252,7 +263,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return result == null ? PsiClass.EMPTY_ARRAY : result.toArray(new PsiClass[result.size()]); } - public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, Processor consumer) { + public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope, @NotNull Processor consumer) { for (PsiElementFinder finder : filteredFinders()) { if (!finder.processPackageDirectories(psiPackage, scope, consumer)) { return false; @@ -261,7 +272,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return true; } - public PsiPackage[] getSubPackages(PsiPackage psiPackage, GlobalSearchScope scope) { + @NotNull + public PsiPackage[] getSubPackages(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { LinkedHashSet result = new LinkedHashSet(); for (PsiElementFinder finder : filteredFinders()) { PsiPackage[] packages = finder.getSubPackages(psiPackage, scope); @@ -334,8 +346,8 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { ContainerUtil.quickSort(list, new Comparator() { @Override public int compare(PsiClass o1, PsiClass o2) { - VirtualFile file2 = PsiUtil.getVirtualFile(o2); - VirtualFile file1 = PsiUtil.getVirtualFile(o1); + VirtualFile file2 = PsiUtilCore.getVirtualFile(o2); + VirtualFile file1 = PsiUtilCore.getVirtualFile(o1); return scope.compare(file2, file1); } }); @@ -343,6 +355,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return list.toArray(new PsiClass[list.size()]); } + @NotNull @Override public Set getClassNames(@NotNull PsiPackage psiPackage, @NotNull GlobalSearchScope scope) { Set names = null; @@ -362,7 +375,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { } @Override - public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull final GlobalSearchScope scope, final Processor consumer) { + public boolean processPackageDirectories(@NotNull PsiPackage psiPackage, @NotNull final GlobalSearchScope scope, @NotNull final Processor consumer) { final PsiManager psiManager = PsiManager.getInstance(getProject()); PackageIndex.getInstance(getProject()).getDirsByPackageName(psiPackage.getQualifiedName(), false).forEach(new ReadActionProcessor() { @Override @@ -378,7 +391,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { @Override - public boolean isPartOfPackagePrefix(String packageName) { + public boolean isPartOfPackagePrefix(@NotNull String packageName) { final Collection packagePrefixes = myFileManager.getNonTrivialPackagePrefixes(); for (final String subpackageName : packagePrefixes) { if (isSubpackageOf(subpackageName, packageName)) return true; @@ -386,7 +399,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return false; } - private static boolean isSubpackageOf(final String subpackageName, String packageName) { + private static boolean isSubpackageOf(@NotNull String subpackageName, @NotNull String packageName) { return subpackageName.equals(packageName) || subpackageName.startsWith(packageName) && subpackageName.charAt(packageName.length()) == '.'; } @@ -423,6 +436,7 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { } @Override + @NotNull public Project getProject() { return myProject; } @@ -433,8 +447,9 @@ public class JavaPsiFacadeImpl extends JavaPsiFacadeEx { return PsiElementFactory.SERVICE.getInstance(myProject); } + @TestOnly @Override - public void setAssertOnFileLoadingFilter(final VirtualFileFilter filter) { + public void setAssertOnFileLoadingFilter(@NotNull final VirtualFileFilter filter) { ((PsiManagerImpl)PsiManager.getInstance(myProject)).setAssertOnFileLoadingFilter(filter); } }