From bc2eebd2cf9cc3a36d981b483ada018b40f1d60c Mon Sep 17 00:00:00 2001 From: Daniel Espendiller Date: Sat, 19 Oct 2019 14:36:56 +0200 Subject: [PATCH] add support for Twig apply tag filters --- .../templating/TwigPattern.java | 21 +++++++++++++++++++ .../TwigTemplateCompletionContributor.java | 15 +++++++++++++ .../TwigTemplateGoToDeclarationHandler.java | 2 +- .../TwigFilterCompletionContributorTest.java | 10 +++++++-- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigPattern.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigPattern.java index dc773af59..1dfbd2a49 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigPattern.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigPattern.java @@ -1089,6 +1089,27 @@ public static ElementPattern getFilterPattern() { .withLanguage(TwigLanguage.INSTANCE); } + /** + * {% apply %}foobar{% endapply %} + */ + static ElementPattern getApplyFilterPattern() { + return PlatformPatterns + .psiElement(TwigTokenTypes.IDENTIFIER) + .afterLeafSkipping( + PlatformPatterns.or( + PlatformPatterns.psiElement(PsiWhiteSpace.class), + PlatformPatterns.psiElement(TwigTokenTypes.WHITE_SPACE) + ), + PlatformPatterns.psiElement(TwigTokenTypes.TAG_NAME).with(new PatternCondition("aa") { + @Override + public boolean accepts(@NotNull PsiElement psiElement, ProcessingContext processingContext) { + return "apply".equalsIgnoreCase(psiElement.getText()); + } + }) + ) + .withLanguage(TwigLanguage.INSTANCE); + } + public static ElementPattern getForTagInVariablePattern() { // {% for key, user in "users" %} diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java index 70b12795c..632e10aa2 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java @@ -171,6 +171,21 @@ private void attachLookupElements(@NotNull CompletionResultSet resultSet, Collec new FilterCompletionProvider() ); + // {% apply upper %}This text becomes uppercase{% endapply %} + extend( + CompletionType.BASIC, + TwigPattern.getApplyFilterPattern(), + new CompletionProvider() { + @Override + protected void addCompletions(@NotNull CompletionParameters completionParameters, @NotNull ProcessingContext processingContext, @NotNull CompletionResultSet completionResultSet) { + Project project = completionParameters.getPosition().getProject(); + for(Map.Entry entry : new TwigExtensionParser(project).getFilters().entrySet()) { + completionResultSet.addElement(new TwigExtensionLookupElement(project, entry.getKey(), entry.getValue())); + } + } + } + ); + // provides support for {{ '' }} extend( CompletionType.BASIC, diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateGoToDeclarationHandler.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateGoToDeclarationHandler.java index 5252d0dac..527450574 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateGoToDeclarationHandler.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateGoToDeclarationHandler.java @@ -103,7 +103,7 @@ public PsiElement[] getGotoDeclarationTargets(PsiElement psiElement, int offset, targets.addAll(TranslationUtil.getDomainPsiFiles(psiElement.getProject(), psiElement.getText())); } - if(TwigPattern.getFilterPattern().accepts(psiElement)) { + if(PlatformPatterns.or(TwigPattern.getFilterPattern(), TwigPattern.getApplyFilterPattern()).accepts(psiElement)) { targets.addAll(getFilterGoTo(psiElement)); } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/TwigFilterCompletionContributorTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/TwigFilterCompletionContributorTest.java index 1207d9c81..f6b93ab05 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/TwigFilterCompletionContributorTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/TwigFilterCompletionContributorTest.java @@ -6,11 +6,12 @@ import com.jetbrains.twig.TwigFileType; import com.jetbrains.twig.elements.TwigElementTypes; import fr.adrienbrault.idea.symfony2plugin.templating.TwigPattern; +import fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateCompletionContributor; import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; /** * @author Daniel Espendiller - * @see com.jetbrains.twig.completion.TwigCompletionContributor + * @see TwigTemplateCompletionContributor */ public class TwigFilterCompletionContributorTest extends SymfonyLightCodeInsightFixtureTestCase { @@ -30,6 +31,11 @@ public void testTwigExtensionFilterCompletion() { assertCompletionContains(TwigFileType.INSTANCE, "{{ 'test' | }}", "doctrine_minify_query", "doctrine_pretty_query"); } + public void testTwigExtensionFilterViaApplyCompletion() { + assertCompletionContains(TwigFileType.INSTANCE, "{% apply %}foo{% endapply %}", "doctrine_minify_query", "doctrine_pretty_query"); + assertNavigationContains(TwigFileType.INSTANCE, "{% apply doctrine_minify_query %}foo{% endapply %}", "Doctrine\\Bundle\\DoctrineBundle\\Twig\\DoctrineExtension::minifyQuery"); + } + public void testTwigExtensionFilterNavigation() { assertNavigationContains(TwigFileType.INSTANCE, "{{ 'test'|doctrine_minify_query }}", "Doctrine\\Bundle\\DoctrineBundle\\Twig\\DoctrineExtension::minifyQuery"); assertNavigationContains(TwigFileType.INSTANCE, "{{ 'test'|doctrine_pretty_query }}", "SqlFormatter::format"); @@ -164,7 +170,7 @@ public void testControllerReferences() { /** * @see fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateCompletionContributor - * @see fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateGoToLocalDeclarationHandler + * @see fr.adrienbrault.idea.symfony2plugin.templating.TwigTemplateGoToDeclarationHandler */ public void testSetTagIsAvailableForFunctionReferences() { assertCompletionContains(TwigFileType.INSTANCE, "{% set = %}", "json_bar");