From b8fe4b7a90d93e35ed95cc382a18908397efd8d8 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 31 May 2013 13:26:57 +0400 Subject: [PATCH] custom processing of dumb mode during search for tests (IDEA-106927) --- .../intellij/execution/ConfigurationUtil.java | 73 +++++++++++-------- .../intellij/execution/junit/TestPackage.java | 5 -- .../configuration/SearchingForTestsTask.java | 20 +++-- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java index 4d1b6adc05a7..04bdff13f2bb 100644 --- a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java +++ b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java @@ -19,6 +19,8 @@ package com.intellij.execution; import com.intellij.execution.junit.JUnitUtil; import com.intellij.execution.junit.TestClassFilter; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; @@ -42,41 +44,48 @@ public class ConfigurationUtil { final PsiManager manager = testClassFilter.getPsiManager(); final Project project = manager.getProject(); - GlobalSearchScope projectScopeWithoutLibraries = GlobalSearchScope.projectScope(project); - final GlobalSearchScope scope = projectScopeWithoutLibraries.intersectWith(testClassFilter.getScope()); - ClassInheritorsSearch.search(testClassFilter.getBase(), scope, true).forEach(new PsiElementProcessorAdapter(new PsiElementProcessor() { - public boolean execute(@NotNull final PsiClass aClass) { - if (testClassFilter.isAccepted(aClass)) found.add(aClass); - return true; + try { + GlobalSearchScope projectScopeWithoutLibraries = GlobalSearchScope.projectScope(project); + final GlobalSearchScope scope = projectScopeWithoutLibraries.intersectWith(testClassFilter.getScope()); + ClassInheritorsSearch.search(testClassFilter.getBase(), scope, true).forEach(new PsiElementProcessorAdapter(new PsiElementProcessor() { + public boolean execute(@NotNull final PsiClass aClass) { + if (testClassFilter.isAccepted(aClass)) found.add(aClass); + return true; + } + })); + + // classes having suite() method + final PsiMethod[] suiteMethods = ApplicationManager.getApplication().runReadAction( + new Computable() { + public PsiMethod[] compute() { + return PsiShortNamesCache.getInstance(project).getMethodsByName(JUnitUtil.SUITE_METHOD_NAME, scope); + } + } + ); + for (final PsiMethod method : suiteMethods) { + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final PsiClass containingClass = method.getContainingClass(); + if (containingClass == null) return; + if (containingClass instanceof PsiAnonymousClass) return; + if (containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) return; + if (containingClass.getContainingClass() != null && !containingClass.hasModifierProperty(PsiModifier.STATIC)) return; + if (JUnitUtil.isSuiteMethod(method) && testClassFilter.isAccepted(containingClass)) { + found.add(containingClass); + } + } + }); } - })); - // classes having suite() method - final PsiMethod[] suiteMethods = ApplicationManager.getApplication().runReadAction( - new Computable() { - public PsiMethod[] compute() { - return PsiShortNamesCache.getInstance(project).getMethodsByName(JUnitUtil.SUITE_METHOD_NAME, scope); - } - } - ); - for (final PsiMethod method : suiteMethods) { - ApplicationManager.getApplication().runReadAction(new Runnable() { - public void run() { - final PsiClass containingClass = method.getContainingClass(); - if (containingClass == null) return; - if (containingClass instanceof PsiAnonymousClass) return; - if (containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) return; - if (containingClass.getContainingClass() != null && !containingClass.hasModifierProperty(PsiModifier.STATIC)) return; - if (JUnitUtil.isSuiteMethod(method) && testClassFilter.isAccepted(containingClass)) { - found.add(containingClass); - } - } - }); + boolean hasJunit4 = addAnnotatedMethodsAnSubclasses(manager, scope, testClassFilter, found, "org.junit.Test", true); + hasJunit4 |= addAnnotatedMethodsAnSubclasses(manager, scope, testClassFilter, found, "org.junit.runner.RunWith", false); + return hasJunit4; + } + catch (IndexNotReadyException e) { + found.clear(); + DumbService.getInstance(project).waitForSmartMode(); + return findAllTestClasses(testClassFilter, found); } - - boolean hasJunit4 = addAnnotatedMethodsAnSubclasses(manager, scope, testClassFilter, found, "org.junit.Test", true); - hasJunit4 |= addAnnotatedMethodsAnSubclasses(manager, scope, testClassFilter, found, "org.junit.runner.RunWith", false); - return hasJunit4; } private static boolean addAnnotatedMethodsAnSubclasses(final PsiManager manager, final GlobalSearchScope scope, final TestClassFilter testClassFilter, diff --git a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java index 54fe72ff7866..1ea8858ec17a 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestPackage.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestPackage.java @@ -367,11 +367,6 @@ public class TestPackage extends TestObject { public void onCancel() { finish(); } - - @Override - public DumbModeAction getDumbModeAction() { - return DumbModeAction.WAIT; - } } private class MySearchForTestsTask extends SearchForTestsTask { private final TestClassFilter myClassFilter; diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java index 52fc696cdd2f..5241db9d146b 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/SearchingForTestsTask.java @@ -30,6 +30,8 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbModeAction; +import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; @@ -90,7 +92,7 @@ public class SearchingForTestsTask extends Task.Backgroundable { try { mySocket = myServerSocket.accept(); try { - fillTestObjects(myClasses); + findAllTests(); } catch (CantRunException e) { logCantRunException(e); @@ -104,6 +106,17 @@ public class SearchingForTestsTask extends Task.Backgroundable { } } + private void findAllTests() throws CantRunException { + try { + fillTestObjects(myClasses); + } + catch (IndexNotReadyException e) { + myClasses.clear(); + DumbService.getInstance(myProject).waitForSmartMode(); + findAllTests(); + } + } + @Override public void onSuccess() { writeTempFile(); @@ -117,11 +130,6 @@ public class SearchingForTestsTask extends Task.Backgroundable { finish(); } - @Override - public DumbModeAction getDumbModeAction() { - return DumbModeAction.WAIT; - } - public void finish() { DataOutputStream os = null; try {