package fr.adrienbrault.idea.symfony2plugin.templating; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.psi.PsiElement; import com.intellij.util.containers.ContainerUtil; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.TwigHelper; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter; import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigExtension; import fr.adrienbrault.idea.symfony2plugin.templating.dict.TwigExtensionLookupElement; import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigExtensionParser; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Map; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class FilterCompletionRegistrar implements GotoCompletionRegistrar { public void register(GotoCompletionRegistrarParameter registrar) { // {% trans foo<caret>bar %} registrar.register(TwigHelper.getFilterTagPattern(), psiElement -> { if (!Symfony2ProjectComponent.isEnabled(psiElement)) { return null; } return new MyFilterTagGotoCompletionProvider(psiElement); }); } /** * {% trans foo<caret>bar %} */ private static class MyFilterTagGotoCompletionProvider extends GotoCompletionProvider { MyFilterTagGotoCompletionProvider(PsiElement psiElement) { super(psiElement); } @NotNull @Override public Collection<LookupElement> getLookupElements() { Collection<LookupElement> lookupElements = new ArrayList<>(); for (Map.Entry<String, TwigExtension> extension : new TwigExtensionParser(getProject()).getFilters().entrySet()) { lookupElements.add(new TwigExtensionLookupElement(getProject(), extension.getKey(), extension.getValue())); } return lookupElements; } @NotNull @Override public Collection<PsiElement> getPsiTargets(PsiElement element) { String text = element.getText(); if(StringUtils.isBlank(text)) { return Collections.emptyList(); } Collection<PsiElement> targets = new ArrayList<>(); for (Map.Entry<String, TwigExtension> extension : new TwigExtensionParser(getProject()).getFilters().entrySet()) { if(!text.equals(extension.getKey())) { continue; } ContainerUtil.addIfNotNull( targets, TwigExtensionParser.getExtensionTarget(getProject(), extension.getValue()) ); } return targets; } } }