diff --git a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java index 61357de92a8a..f884997e3038 100644 --- a/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java +++ b/java/execution/impl/src/com/intellij/execution/junit/JUnitUtil.java @@ -24,6 +24,7 @@ import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.searches.ClassInheritorsSearch; @@ -33,6 +34,7 @@ import com.intellij.util.Processor; import com.intellij.util.containers.Convertor; import junit.runner.BaseTestRunner; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.junit.After; import org.junit.AfterClass; @@ -51,19 +53,22 @@ public class JUnitUtil { @NonNls public static final String RUN_WITH = "org.junit.runner.RunWith"; @NonNls public static final String SUITE_METHOD_NAME = "suite"; - public static boolean isSuiteMethod(final PsiMethod psiMethod) { - if (psiMethod == null) return false; + private static final Key TEST_INTERFACE_KEY = Key.create(TEST_INTERFACE); + public static boolean isSuiteMethod(@NotNull PsiMethod psiMethod, @NotNull Project project) { if (!psiMethod.hasModifierProperty(PsiModifier.PUBLIC)) return false; if (!psiMethod.hasModifierProperty(PsiModifier.STATIC)) return false; if (psiMethod.isConstructor()) return false; final PsiType returnType = psiMethod.getReturnType(); - if (returnType != null) { - if (!returnType.equalsToText(TEST_INTERFACE) && !returnType.equalsToText(TESTSUITE_CLASS)) { - final PsiType testType = - JavaPsiFacade.getInstance(psiMethod.getProject()).getElementFactory().createTypeFromText(TEST_INTERFACE, null); - if (!TypeConversionUtil.isAssignable(testType, returnType)) { - return false; - } + if (returnType == null || returnType instanceof PsiPrimitiveType) return false; + if (!returnType.equalsToText(TEST_INTERFACE) && !returnType.equalsToText(TESTSUITE_CLASS)) { + PsiType cachedTestInterfaceType = project.getUserData(TEST_INTERFACE_KEY); + if (cachedTestInterfaceType == null) { + final PsiType testType = JavaPsiFacade.getInstance(project).getElementFactory().createTypeFromText(TEST_INTERFACE, null); + project.putUserData(TEST_INTERFACE_KEY,testType); + cachedTestInterfaceType = testType; + } + if (!TypeConversionUtil.isAssignable(cachedTestInterfaceType, returnType)) { + return false; } } return psiMethod.getParameterList().getParametersCount() == 0; @@ -109,7 +114,7 @@ public class JUnitUtil { return isTestClass(psiClass, true, true); } - private static boolean isTestClass(final PsiClass psiClass, boolean checkAbstract, boolean checkForTestCaseInheritance) { + private static boolean isTestClass(@NotNull PsiClass psiClass, boolean checkAbstract, boolean checkForTestCaseInheritance) { if (!PsiClassUtil.isRunnableClass(psiClass, true, checkAbstract)) return false; if (checkForTestCaseInheritance && isTestCaseInheritor(psiClass)) return true; final PsiModifierList modifierList = psiClass.getModifierList(); @@ -118,7 +123,7 @@ public class JUnitUtil { for (final PsiMethod method : psiClass.getAllMethods()) { ProgressManager.checkCanceled(); - if (isSuiteMethod(method)) return true; + if (isSuiteMethod(method, psiClass.getProject())) return true; if (isTestAnnotated(method)) return true; } @@ -241,7 +246,7 @@ public class JUnitUtil { public static PsiMethod findFirstTestMethod(PsiClass clazz) { PsiMethod testMethod = null; for (PsiMethod method : clazz.getMethods()) { - if (isTestMethod(MethodLocation.elementInClass(method, clazz)) || isSuiteMethod(method)) { + if (isTestMethod(MethodLocation.elementInClass(method, clazz)) || isSuiteMethod(method, clazz.getProject())) { testMethod = method; break; } diff --git a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java index 47a46f16712f..71031a9fdb6f 100644 --- a/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java +++ b/plugins/junit/src/com/intellij/execution/ConfigurationUtil.java @@ -19,6 +19,7 @@ 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.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Ref; import com.intellij.psi.*; @@ -38,7 +39,8 @@ public class ConfigurationUtil { public static boolean findAllTestClasses(final TestClassFilter testClassFilter, final Set found) { final PsiManager manager = testClassFilter.getPsiManager(); - GlobalSearchScope projectScopeWithoutLibraries = GlobalSearchScope.projectScope(manager.getProject()); + 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(final PsiClass aClass) { @@ -51,7 +53,7 @@ public class ConfigurationUtil { final PsiMethod[] suiteMethods = ApplicationManager.getApplication().runReadAction( new Computable() { public PsiMethod[] compute() { - return JavaPsiFacade.getInstance(manager.getProject()).getShortNamesCache().getMethodsByName(JUnitUtil.SUITE_METHOD_NAME, scope); + return JavaPsiFacade.getInstance(project).getShortNamesCache().getMethodsByName(JUnitUtil.SUITE_METHOD_NAME, scope); } } ); @@ -67,7 +69,7 @@ public class ConfigurationUtil { if (containingClass.getContainingClass() != null && !containingClass.hasModifierProperty(PsiModifier.STATIC)) continue; if (ApplicationManager.getApplication().runReadAction(new Computable() { public Boolean compute() { - return JUnitUtil.isSuiteMethod(method); + return JUnitUtil.isSuiteMethod(method, project); } }).booleanValue()) { found.add(containingClass);