cache part of JUnitUtil.isTestClass to avoid O(methods^2) during highlighting

This commit is contained in:
peter
2016-06-01 16:46:48 +02:00
parent f1ada73036
commit 671fc8b23d
@@ -27,12 +27,9 @@ import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.searches.ClassInheritorsSearch;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiClassUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.*;
import com.intellij.testIntegration.JavaTestFramework;
import com.intellij.testIntegration.TestFramework;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -144,22 +141,24 @@ public class JUnitUtil {
}
}
}
final PsiModifierList modifierList = psiClass.getModifierList();
if (modifierList == null) return false;
final boolean hasJUnit5 = isJUnit5(modifierList);
boolean hasJUnit5 = isJUnit5(psiClass);
if (!PsiClassUtil.isRunnableClass(psiClass, !hasJUnit5, checkAbstract)) return false;
if (AnnotationUtil.isAnnotated(psiClass, RUN_WITH, true)) return true;
if (checkForTestCaseInheritance && (!hasJUnit5 || psiClass.hasModifierProperty(PsiModifier.PUBLIC)) && isTestCaseInheritor(psiClass)) return true;
return CachedValuesManager.getCachedValue(psiClass, () ->
CachedValueProvider.Result.create(hasTestOrSuiteMethods(psiClass), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT));
}
private static boolean hasTestOrSuiteMethods(@NotNull PsiClass psiClass) {
for (final PsiMethod method : psiClass.getAllMethods()) {
ProgressManager.checkCanceled();
if (isSuiteMethod(method)) return true;
if (isTestAnnotated(method)) return true;
}
if (hasJUnit5) {
if (isJUnit5(psiClass)) {
for (PsiClass innerClass : psiClass.getInnerClasses()) {
for (PsiMethod method : innerClass.getAllMethods()) {
if (isTestAnnotated(method)) return true;