package net.jangaroo.ide.idea; import com.intellij.lang.javascript.JavaScriptSupportLoader; import com.intellij.lang.javascript.dialects.JSDialectSpecificHandlersFactory; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.lang.javascript.psi.resolve.JSClassResolver; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.java.JavaSourceRootType; import java.util.Arrays; import java.util.HashSet; import java.util.List; /** * Common static utility methods. */ public class Utils { public static String getModuleRelativeSourcePath(Project project, VirtualFile file, char separator) { final Module module = getModuleForFile(project, file); if (module != null) { List<VirtualFile> sourceRoots = ModuleRootManager.getInstance(module).getSourceRoots(new HashSet<JavaSourceRootType>(Arrays.asList(JavaSourceRootType.SOURCE, JavaSourceRootType.TEST_SOURCE))); for (VirtualFile sourceRoot : sourceRoots) { if (VfsUtil.isAncestor(sourceRoot, file, false)) { return VfsUtil.getRelativePath(file, sourceRoot, separator); } } } return ""; } public static Module getModuleForFile(Project project, VirtualFile file) { return ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(file); } @NotNull private static JSClassResolver getActionScriptClassResolver() { return JSDialectSpecificHandlersFactory.forLanguage(JavaScriptSupportLoader.ECMA_SCRIPT_L4).getClassResolver(); } private static boolean isValidActionScriptClass(PsiElement asClass) { return asClass instanceof JSClass && asClass.isValid(); } public static JSClass getActionScriptClass(PsiElement context, String className) { PsiElement asClass = getActionScriptClassResolver().findClassByQName(className, context); return isValidActionScriptClass(asClass) ? (JSClass)asClass : null; } public static VirtualFile getActionScriptFile(@NotNull Project project, String fullyQualifiedName) { PsiElement asClass = getActionScriptClassResolver().findClassByQName(fullyQualifiedName, GlobalSearchScope.projectScope(project)); return isValidActionScriptClass(asClass) ? asClass.getContainingFile().getVirtualFile() : null; } }