package fr.adrienbrault.idea.symfony2plugin.templating.variable.collector;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.elements.*;
import com.jetbrains.php.phpunit.PhpUnitUtil;
import fr.adrienbrault.idea.symfony2plugin.templating.util.PhpMethodVariableResolveUtil;
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigFileVariableCollector;
import fr.adrienbrault.idea.symfony2plugin.templating.variable.TwigFileVariableCollectorParameter;
import fr.adrienbrault.idea.symfony2plugin.templating.variable.dict.PsiVariable;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class GlobalExtensionVariableCollector implements TwigFileVariableCollector, TwigFileVariableCollector.TwigFileVariableCollectorExt {
@Override
public void collectVars(TwigFileVariableCollectorParameter parameter, Map<String, PsiVariable> variables) {
PhpIndex phpIndex = PhpIndex.getInstance(parameter.getProject());
for(PhpClass phpClass : phpIndex.getAllSubclasses("\\Twig_ExtensionInterface")) {
if(!PhpUnitUtil.isPhpUnitTestFile(phpClass.getContainingFile())) {
// @TODO: signature vs getMethod faster?
Method method = phpClass.findMethodByName("getGlobals");
if(method != null) {
Collection<PhpReturn> phpReturns = PsiTreeUtil.findChildrenOfType(method, PhpReturn.class);
for(PhpReturn phpReturn: phpReturns) {
PhpPsiElement returnPsiElement = phpReturn.getFirstPsiChild();
if(returnPsiElement instanceof ArrayCreationExpression) {
variables.putAll(PhpMethodVariableResolveUtil.getTypesOnArrayHash((ArrayCreationExpression) returnPsiElement));
}
}
}
}
}
}
@Override
public void collect(TwigFileVariableCollectorParameter parameter, Map<String, Set<String>> variables) {
}
}