package fr.adrienbrault.idea.symfony2plugin.templating.dict; import com.intellij.codeInsight.completion.InsertionContext; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementPresentation; import com.intellij.openapi.project.Project; import com.jetbrains.php.PhpIndex; import com.jetbrains.php.PhpPresentationUtil; import com.jetbrains.php.lang.psi.elements.Function; import com.jetbrains.php.lang.psi.elements.Parameter; import com.jetbrains.php.lang.psi.elements.PhpNamedElement; import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigExtensionParser; import fr.adrienbrault.idea.symfony2plugin.util.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class TwigExtensionLookupElement extends LookupElement { final private TwigExtension twigExtension; final private String name; final private Project project; public TwigExtensionLookupElement(Project project, String name, TwigExtension twigExtension) { this.project = project; this.name = name; this.twigExtension = twigExtension; } @NotNull @Override public String getLookupString() { return name; } @Override public void handleInsert(InsertionContext context) { if(twigExtension.getTwigExtensionType() == TwigExtensionParser.TwigExtensionType.SIMPLE_FUNCTION) { TwigExtensionInsertHandler.getInstance().handleInsert(context, this, twigExtension); } super.handleInsert(context); } @Override public void renderElement(LookupElementPresentation presentation) { presentation.setIcon(TwigExtensionParser.getIcon(this.twigExtension.getTwigExtensionType())); buildTailText(presentation); presentation.setItemText(name); presentation.setTypeText(StringUtils.camelize(this.twigExtension.getType().toLowerCase())); presentation.setTypeGrayed(true); } private void buildTailText(LookupElementPresentation presentation) { if(this.twigExtension.getTwigExtensionType() == TwigExtensionParser.TwigExtensionType.SIMPLE_TEST) { return; } String signature = this.twigExtension.getSignature(); if(signature == null) { return; } Collection<? extends PhpNamedElement> phpNamedElements = PhpIndex.getInstance(this.project).getBySignature(signature); if(phpNamedElements.size() == 0) { return; } PhpNamedElement function = phpNamedElements.iterator().next(); if(function instanceof Function) { List<Parameter> parameters = new LinkedList<>(Arrays.asList(((Function) function).getParameters())); if(this.twigExtension.getOption("needs_context") != null && parameters.size() > 0) { parameters.remove(0); } if(this.twigExtension.getOption("needs_environment") != null && parameters.size() > 0) { parameters.remove(0); } presentation.setTailText(PhpPresentationUtil.formatParameters(null, parameters.toArray(new Parameter[parameters.size()])).toString(), true); } } }