From c2f63aec5eeaa4dd6775905b3a13948489063d69 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 5 Aug 2015 19:51:19 +0200 Subject: [PATCH] don't traverse the same class inheritors several times when searching for test classes --- .../intellij/execution/ConfigurationUtil.java | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java index 3d8da3aac313..2f1694dd0686 100644 --- a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java +++ b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java @@ -18,7 +18,10 @@ package com.intellij.execution; import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.junit.TestClassFilter; +import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.application.ReadActionProcessor; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; @@ -95,36 +98,36 @@ public class ConfigurationUtil { //allScope is used to find all abstract test cases which probably have inheritors in the current 'scope' AnnotatedMembersSearch.search(testAnnotation, GlobalSearchScope.allScope(manager.getProject())).forEach(new Processor() { public boolean process(final PsiMember annotated) { - final PsiClass containingClass = annotated instanceof PsiClass ? (PsiClass)annotated : ApplicationManager.getApplication() - .runReadAction(new Computable() { - @Override - public PsiClass compute() { - return annotated.getContainingClass(); - } - }); - if (containingClass != null && annotated instanceof PsiMethod == isMethod) { - if (ApplicationManager.getApplication().runReadAction( - new Computable() { - @Override - public Boolean compute() { - final VirtualFile file = PsiUtilCore.getVirtualFile(containingClass); - return file != null && scope.contains(file) && testClassFilter.isAccepted(containingClass); - } - })) { - found.add(containingClass); + final PsiClass containingClass; + + AccessToken token = ReadAction.start(); + try { + containingClass = annotated instanceof PsiClass ? (PsiClass)annotated : annotated.getContainingClass(); + if (containingClass == null || annotated instanceof PsiMethod != isMethod) { + return true; + } + final VirtualFile file = PsiUtilCore.getVirtualFile(containingClass); + if (file != null && scope.contains(file) && testClassFilter.isAccepted(containingClass)) { + if (!found.add(containingClass)) { + return true; + } isJUnit4.set(Boolean.TRUE); } - ClassInheritorsSearch.search(containingClass, scope, true, true, false) - .forEach(new PsiElementProcessorAdapter(new PsiElementProcessor() { - public boolean execute(@NotNull final PsiClass aClass) { - if (testClassFilter.isAccepted(aClass)) { - found.add(aClass); - isJUnit4.set(Boolean.TRUE); - } - return true; - } - })); } + finally { + token.finish(); + } + + ClassInheritorsSearch.search(containingClass, scope, true, true, false).forEach(new ReadActionProcessor() { + @Override + public boolean processInReadAction(PsiClass aClass) { + if (testClassFilter.isAccepted(aClass)) { + found.add(aClass); + isJUnit4.set(Boolean.TRUE); + } + return true; + } + }); return true; } });