custom processing of dumb mode during search for tests (IDEA-106927)

This commit is contained in:
Anna Kozlova
2013-05-31 13:28:19 +04:00
parent dde486118c
commit b8fe4b7a90
3 changed files with 55 additions and 43 deletions
@@ -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<PsiClass>(new PsiElementProcessor<PsiClass>() {
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<PsiClass>(new PsiElementProcessor<PsiClass>() {
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<PsiMethod[]>() {
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<PsiMethod[]>() {
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,
@@ -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;
@@ -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 {