From 262ef8de80156e63ce5d0bc51c43aba3a4dcab8b Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 20 Jul 2016 16:54:30 +0200 Subject: [PATCH] cache LambdaUtil.findFunctionCandidates --- .../src/com/intellij/psi/LambdaUtil.java | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java index c1864e69373e..7376042ef16e 100644 --- a/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/LambdaUtil.java @@ -216,36 +216,46 @@ public class LambdaUtil { } @Nullable - public static List findFunctionCandidates(PsiClass psiClass) { + public static List findFunctionCandidates(final PsiClass psiClass) { if (psiClass != null && psiClass.isInterface() && !psiClass.isAnnotationType()) { - final List methods = new ArrayList(); - final Map> overrideEquivalents = PsiSuperMethodUtil.collectOverrideEquivalents(psiClass); - final Collection visibleSignatures = psiClass.getVisibleSignatures(); - for (HierarchicalMethodSignature signature : visibleSignatures) { - final PsiMethod psiMethod = signature.getMethod(); - if (!psiMethod.hasModifierProperty(PsiModifier.ABSTRACT)) continue; - if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) continue; - final Set equivalentMethods = overrideEquivalents.get(signature); - if (equivalentMethods != null && equivalentMethods.size() > 1) { - boolean hasNonAbstractOverrideEquivalent = false; - for (PsiMethod method : equivalentMethods) { - if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !MethodSignatureUtil.isSuperMethod(method, psiMethod)) { - hasNonAbstractOverrideEquivalent = true; - break; - } - } - if (hasNonAbstractOverrideEquivalent) continue; + return CachedValuesManager.getCachedValue(psiClass, new CachedValueProvider>() { + @Nullable + @Override + public Result> compute() { + return Result.create(calcFunctionCandidates(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT); } - if (!overridesPublicObjectMethod(signature)) { - methods.add(signature); - } - } - - return hasSubsignature(methods); + }); } return null; } + private static List calcFunctionCandidates(PsiClass psiClass) { + final List methods = new ArrayList(); + final Map> overrideEquivalents = PsiSuperMethodUtil.collectOverrideEquivalents(psiClass); + final Collection visibleSignatures = psiClass.getVisibleSignatures(); + for (HierarchicalMethodSignature signature : visibleSignatures) { + final PsiMethod psiMethod = signature.getMethod(); + if (!psiMethod.hasModifierProperty(PsiModifier.ABSTRACT)) continue; + if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) continue; + final Set equivalentMethods = overrideEquivalents.get(signature); + if (equivalentMethods != null && equivalentMethods.size() > 1) { + boolean hasNonAbstractOverrideEquivalent = false; + for (PsiMethod method : equivalentMethods) { + if (!method.hasModifierProperty(PsiModifier.ABSTRACT) && !MethodSignatureUtil.isSuperMethod(method, psiMethod)) { + hasNonAbstractOverrideEquivalent = true; + break; + } + } + if (hasNonAbstractOverrideEquivalent) continue; + } + if (!overridesPublicObjectMethod(signature)) { + methods.add(signature); + } + } + + return hasSubsignature(methods); + } + @Nullable private static PsiType getReturnType(PsiClass psiClass, MethodSignature methodSignature) {