| package org.jetbrains.android.run.testing; |
| |
| import com.intellij.execution.Location; |
| import com.intellij.execution.PsiLocation; |
| import com.intellij.openapi.module.Module; |
| import com.intellij.openapi.module.ModuleManager; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.psi.JavaPsiFacade; |
| import com.intellij.psi.PsiClass; |
| import com.intellij.psi.PsiElement; |
| import com.intellij.psi.PsiMethod; |
| import com.intellij.psi.search.GlobalSearchScope; |
| import com.intellij.testIntegration.TestLocationProvider; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** |
| * @author Eugene.Kudelevsky |
| */ |
| public class AndroidTestLocationProvider implements TestLocationProvider { |
| @NonNls public static final String PROTOCOL_ID = "android"; |
| |
| @NotNull |
| @Override |
| public List<Location> getLocation(@NotNull String protocolId, @NotNull String locationData, Project project) { |
| if (PROTOCOL_ID.equals(protocolId)) { |
| final PsiElement element = findElement(locationData, project); |
| |
| if (element != null) { |
| return Collections.singletonList((Location)new PsiLocation<PsiElement>(project, element)); |
| } |
| } |
| return Collections.emptyList(); |
| } |
| |
| @Nullable |
| private static PsiElement findElement(String link, Project project) { |
| int idx = link.indexOf(":"); |
| |
| if (idx <= 0) { |
| return null; |
| } |
| final String moduleName = link.substring(0, idx); |
| final Module module = ModuleManager.getInstance(project).findModuleByName(moduleName); |
| link = link.substring(idx + 1); |
| |
| final GlobalSearchScope scope = module != null ? module.getModuleWithDependenciesScope() : GlobalSearchScope.allScope(project); |
| PsiClass aClass = JavaPsiFacade.getInstance(project).findClass(link, scope); |
| |
| if (aClass != null) { |
| return aClass; |
| } |
| if (link.contains(".") && link.endsWith("()")) { |
| idx = link.lastIndexOf('.'); |
| final String className = link.substring(0, idx); |
| aClass = JavaPsiFacade.getInstance(project).findClass(className, scope); |
| |
| if (aClass != null) { |
| final String methodName = link.substring(idx + 1, link.length() - 2); |
| final PsiMethod[] methods = aClass.findMethodsByName(methodName, false); |
| |
| if (methods.length == 0) { |
| return null; |
| } |
| if (methods.length == 1) { |
| return methods[0]; |
| } |
| for (PsiMethod method : methods) { |
| if (method.getParameterList().getParametersCount() == 0) { |
| return method; |
| } |
| } |
| return methods[0]; |
| } |
| } |
| return null; |
| } |
| } |