package fr.adrienbrault.idea.symfony2plugin.util;
import com.intellij.openapi.project.Project;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import com.jetbrains.php.lang.psi.elements.PhpNamespace;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class PhpIndexUtil {
/**
* Collect PhpClass which are inside current namespace and in sub-namespaces
*
* @param project current project
* @param namespaceName namespace name should start with \ and not end with "\"
* @return classes inside namespace and sub-namespace
*/
@NotNull
public static Collection<PhpClass> getPhpClassInsideNamespace(@NotNull Project project, @NotNull String namespaceName) {
return getPhpClassInsideNamespace(project, PhpIndex.getInstance(project), namespaceName, 10);
}
@NotNull
private static Collection<PhpClass> getPhpClassInsideNamespace(@NotNull Project project, @NotNull PhpIndex phpIndex, @NotNull String namespaceName, int maxDeep) {
final Collection<PhpClass> phpClasses = new ArrayList<>();
if(maxDeep-- <= 0) {
return phpClasses;
}
for (PhpNamespace phpNamespace : phpIndex.getNamespacesByName(namespaceName.toLowerCase())) {
phpClasses.addAll(PsiTreeUtil.getChildrenOfTypeAsList(phpNamespace.getStatements(), PhpClass.class));
}
for(String ns: phpIndex.getChildNamespacesByParentName(namespaceName + "\\")) {
phpClasses.addAll(getPhpClassInsideNamespace(project, phpIndex, namespaceName + "\\" + ns, maxDeep));
}
return phpClasses;
}
public static boolean hasNamespace(@NotNull Project project, @NotNull String namespaceName) {
if(!namespaceName.startsWith("\\")) {
namespaceName = "\\" + namespaceName;
}
return PhpIndex.getInstance(project).getChildNamespacesByParentName(namespaceName + "\\").size() > 0;
}
}