package com.intellij.lang.javascript.flex.flexunit;
import com.intellij.execution.Location;
import com.intellij.execution.PsiLocation;
import com.intellij.execution.testframework.sm.runner.SMTestLocator;
import com.intellij.javascript.flex.resolve.ActionScriptClassResolver;
import com.intellij.lang.javascript.index.JavaScriptIndex;
import com.intellij.lang.javascript.psi.JSElement;
import com.intellij.lang.javascript.psi.JSFunction;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.List;
public class FlexQualifiedNameLocationProvider implements SMTestLocator {
private static final String PROTOCOL_ID = "flex_qn";
public static final FlexQualifiedNameLocationProvider INSTANCE = new FlexQualifiedNameLocationProvider();
@NotNull
@Override
public List<Location> getLocation(@NotNull String protocol, @NotNull String path, @NotNull Project project, @NotNull GlobalSearchScope scope) {
if (PROTOCOL_ID.equals(protocol)) {
JSElement element = findElement(path, project);
if (element != null) {
return Collections.singletonList(new PsiLocation<PsiElement>(project, element));
}
}
return Collections.emptyList();
}
@Nullable
private static JSElement findElement(String link, Project project) {
String moduleName = link.substring(0, link.indexOf(":"));
Module module = ModuleManager.getInstance(project).findModuleByName(moduleName);
link = link.substring(link.indexOf(":") + 1);
final JavaScriptIndex index = JavaScriptIndex.getInstance(project);
PsiElement element = ActionScriptClassResolver.findClassByQName(link, index, module);
if (element instanceof JSClass) {
return (JSElement)element;
}
if (element == null && link.contains(".") && link.endsWith("()")) {
String qname = link.substring(0, link.lastIndexOf('.'));
element = ActionScriptClassResolver.findClassByQName(qname, index, module);
if (element instanceof JSClass) {
String methodName = link.substring(link.lastIndexOf('.') + 1, link.length() - 2);
return ((JSClass)element).findFunctionByNameAndKind(methodName, JSFunction.FunctionKind.SIMPLE);
}
}
return null;
}
}