blob: 8ea2fc360c355be51a94da12459c5f13d6bcdc16 [file] [log] [blame]
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;
}
}