package fr.adrienbrault.idea.symfony2plugin.templating.dict;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.psi.PsiElement;
import com.jetbrains.php.completion.insert.PhpInsertHandlerUtil;
import com.jetbrains.php.lang.psi.elements.Function;
import com.jetbrains.php.lang.psi.elements.Parameter;
import com.jetbrains.php.lang.psi.resolve.types.PhpType;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import fr.adrienbrault.idea.symfony2plugin.util.completion.FunctionInsertHandler;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class TwigExtensionInsertHandler {
private static final TwigExtensionInsertHandler INSTANCE = new TwigExtensionInsertHandler();
public void handleInsert(@NotNull InsertionContext context, @NotNull LookupElement lookupElement, @NotNull TwigExtension twigExtension) {
// {{ form_javasc|() }}
// {{ form_javasc| }}
if(PhpInsertHandlerUtil.isStringAtCaret(context.getEditor(), "(")) {
return;
}
FunctionInsertHandler.getInstance().handleInsert(context, lookupElement);
// if first parameter is a string type; add quotes
for (PsiElement psiElement : PhpElementsUtil.getPsiElementsBySignature(context.getProject(), twigExtension.getSignature())) {
if(!(psiElement instanceof Function)) {
continue;
}
Parameter[] parameters = ((Function) psiElement).getParameters();
// skip Twig parameter, we need first function parameter
int parameter = 0;
if(twigExtension.getOption("needs_context") != null) {
parameter++;
}
if(twigExtension.getOption("needs_environment") != null) {
parameter++;
}
if(parameters.length <= parameter) {
continue;
}
if(!isString(parameters[parameter].getType())) {
continue;
}
// wrap caret with '' so we have foobar('<caret>')
PhpInsertHandlerUtil.insertStringAtCaret(context.getEditor(), "''");
context.getEditor().getCaretModel().moveCaretRelatively(-1, 0, false, false, true);
return;
}
}
private boolean isString(@NotNull PhpType type) {
for (String s : type.getTypes()) {
if(StringUtils.stripStart(s, "\\").equalsIgnoreCase("string")) {
return true;
}
}
return false;
}
@NotNull
public static TwigExtensionInsertHandler getInstance(){
return INSTANCE;
}
}