package fr.adrienbrault.idea.symfony2plugin.templating.variable.collector;
import com.intellij.psi.PsiComment;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.lang.psi.elements.Method;
import com.jetbrains.twig.TwigFile;
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 fr.adrienbrault.idea.symfony2plugin.util.controller.ControllerIndex;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class ControllerDocVariableCollector implements TwigFileVariableCollector, TwigFileVariableCollector.TwigFileVariableCollectorExt {
public static String DOC_PATTERN = "\\{#[\\s]+@[C|c]ontroller[\\s]+([\\w\\\\\\[\\]:]+)[\\s]+#}";
public static String DOC_PATTERN_COMPLETION = "\\{#[\\s]+@[C|c]ontroller[\\s]+.*#}";
@Override
public void collectVars(TwigFileVariableCollectorParameter parameter, Map<String, PsiVariable> variables) {
PsiFile psiFile = parameter.getElement().getContainingFile();
if(!(psiFile instanceof TwigFile)) {
return;
}
ArrayList<String> controllerNames = findFileControllerDocBlocks((TwigFile) psiFile);
if(controllerNames.size() == 0) {
return;
}
ControllerIndex controllerIndex = new ControllerIndex(parameter.getProject());
for(String controllerName: controllerNames) {
Method method = controllerIndex.resolveShortcutName(controllerName);
if(method != null) {
variables.putAll(PhpMethodVariableResolveUtil.collectMethodVariables(method));
}
}
}
private static ArrayList<String> findFileControllerDocBlocks(TwigFile twigFile) {
Pattern pattern = Pattern.compile(DOC_PATTERN);
ArrayList<String> controller = new ArrayList<>();
for(PsiComment psiComment: PsiTreeUtil.getChildrenOfTypeAsList(twigFile, PsiComment.class)) {
Matcher matcher = pattern.matcher(psiComment.getText());
if (matcher.find()) {
controller.add(matcher.group(1));
}
}
return controller;
}
@Override
public void collect(TwigFileVariableCollectorParameter parameter, Map<String, Set<String>> variables) {
}
}