From 2846f01914c84cd872b35a210268f470806289de Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 3 Jun 2015 09:59:41 +0200 Subject: [PATCH] faster overriding method search --- .../JavaAllOverridingMethodsSearcher.java | 49 +++++++++++-------- .../search/JavaOverridingMethodsSearcher.java | 25 +++++++--- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaAllOverridingMethodsSearcher.java b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaAllOverridingMethodsSearcher.java index f8f824b77c95..a614854ba728 100644 --- a/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaAllOverridingMethodsSearcher.java +++ b/java/java-indexing-impl/src/com/intellij/psi/impl/search/JavaAllOverridingMethodsSearcher.java @@ -28,11 +28,9 @@ import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Processor; import com.intellij.util.QueryExecutor; +import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; - /** * @author ven */ @@ -41,13 +39,14 @@ public class JavaAllOverridingMethodsSearcher implements QueryExecutor> consumer) { final PsiClass psiClass = p.getPsiClass(); - final List methods = ApplicationManager.getApplication().runReadAction(new Computable>() { + final MultiMap methods = ApplicationManager.getApplication().runReadAction(new Computable>() { @Override - public List compute() { - PsiMethod[] methodsArray = psiClass.getMethods(); - final List methods = new ArrayList(methodsArray.length); - for (PsiMethod method : methodsArray) { - if (PsiUtil.canBeOverriden(method)) methods.add(method); + public MultiMap compute() { + final MultiMap methods = MultiMap.create(); + for (PsiMethod method : psiClass.getMethods()) { + if (PsiUtil.canBeOverriden(method)) { + methods.putValue(method.getName(), method); + } } return methods; } @@ -59,17 +58,27 @@ public class JavaAllOverridingMethodsSearcher implements QueryExecutor inheritorsProcessor = new Processor() { @Override public boolean process(PsiClass inheritor) { - //could be null if not java inheritor, TODO only JavaClassInheritors are needed - PsiSubstitutor substitutor = TypeConversionUtil.getClassSubstitutor(psiClass, inheritor, PsiSubstitutor.EMPTY); - if (substitutor == null) return true; + PsiSubstitutor substitutor = null; + + for (String name : methods.keySet()) { + if (inheritor.findMethodsByName(name, false).length == 0) continue; + + for (PsiMethod method : methods.get(name)) { + if (method.hasModifierProperty(PsiModifier.PACKAGE_LOCAL) && + !JavaPsiFacade.getInstance(inheritor.getProject()).arePackagesTheSame(psiClass, inheritor)) continue; + + if (substitutor == null) { + //could be null if not java inheritor, TODO only JavaClassInheritors are needed + substitutor = TypeConversionUtil.getClassSubstitutor(psiClass, inheritor, PsiSubstitutor.EMPTY); + if (substitutor == null) return true; + } + + MethodSignature signature = method.getSignature(substitutor); + PsiMethod inInheritor = MethodSignatureUtil.findMethodBySuperSignature(inheritor, signature, false); + if (inInheritor != null && !inInheritor.hasModifierProperty(PsiModifier.STATIC)) { + if (!consumer.process(Pair.create(method, inInheritor))) return false; + } - for (PsiMethod method : methods) { - if (method.hasModifierProperty(PsiModifier.PACKAGE_LOCAL) && - !JavaPsiFacade.getInstance(inheritor.getProject()).arePackagesTheSame(psiClass, inheritor)) continue; - - MethodSignature signature = method.getSignature(substitutor); - PsiMethod inInheritor = MethodSignatureUtil.findMethodBySuperSignature(inheritor, signature, false); - if (inInheritor == null || inInheritor.hasModifierProperty(PsiModifier.STATIC)) { if (psiClass.isInterface() && !inheritor.isInterface()) { //check for sibling implementation final PsiClass superClass = inheritor.getSuperClass(); if (superClass != null && !superClass.isInheritor(psiClass, true)) { @@ -79,9 +88,7 @@ public class JavaAllOverridingMethodsSearcher implements QueryExecutor 0) { + PsiMethod found = MethodSignatureUtil.findMethodBySuperSignature(inheritor, getSuperSignature(inheritor, parentClass, method), false); + if (found != null && isAcceptable(found, method)) { + return found; + } } if (parentClass.isInterface() && !inheritor.isInterface()) { //check for sibling implementation final PsiClass superClass = inheritor.getSuperClass(); - if (superClass != null && !superClass.isInheritor(parentClass, true)) { + if (superClass != null && !superClass.isInheritor(parentClass, true) && superClass.findMethodsByName(name, true).length > 0) { + MethodSignature signature = getSuperSignature(inheritor, parentClass, method); PsiMethod derived = MethodSignatureUtil.findMethodInSuperClassBySignatureInDerived(inheritor, superClass, signature, true); if (derived != null && isAcceptable(derived, method)) { return derived; @@ -71,6 +71,15 @@ public class JavaOverridingMethodsSearcher implements QueryExecutor