package fr.adrienbrault.idea.symfony2plugin.util; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.PhpIndex; import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.util.dict.SymfonyCommand; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class SymfonyCommandUtil { @NotNull public static Collection<SymfonyCommand> getCommands(@NotNull Project project) { Collection<SymfonyCommand> symfonyCommands = new ArrayList<>(); for (PhpClass phpClass : PhpIndex.getInstance(project).getAllSubclasses("\\Symfony\\Component\\Console\\Command\\Command")) { if(PhpElementsUtil.isTestClass(phpClass)) { continue; } Method method = phpClass.findOwnMethodByName("configure"); if(method == null) { continue; } PsiElement[] psiElements = PsiTreeUtil.collectElements(method, psiElement -> psiElement instanceof MethodReference && "setName".equals(((MethodReference) psiElement).getName()) ); for (PsiElement psiElement : psiElements) { if(!(psiElement instanceof MethodReference)) { continue; } PsiElement psiMethodParameter = PsiElementUtils.getMethodParameterPsiElementAt((MethodReference) psiElement, 0); if(psiMethodParameter == null) { continue; } String stringValue = PhpElementsUtil.getStringValue(psiMethodParameter); if(stringValue == null) { continue; } symfonyCommands.add(new SymfonyCommand(stringValue, psiElement)); } } return symfonyCommands; } }