Skip to content

Commit c8a38f7

Browse files
committed
fix Twig filter pattern to support wrapped TwigVariableReference since PhpStorm 2024.1
1 parent 512a8b1 commit c8a38f7

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigPattern.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,8 +1167,19 @@ public static ElementPattern<PsiElement> getForTagVariablePattern() {
11671167

11681168
/**
11691169
* {{ 'test'|<caret> }}
1170+
* {% for user in users|de<caret> %}
11701171
*/
11711172
public static ElementPattern<PsiElement> getFilterPattern() {
1173+
return PlatformPatterns.or(
1174+
getFilterAsIdentifierPattern(),
1175+
getFilterAsVariableReferencePattern()
1176+
);
1177+
}
1178+
1179+
/**
1180+
* {{ 'test'|<caret> }}
1181+
*/
1182+
private static ElementPattern<PsiElement> getFilterAsIdentifierPattern() {
11721183
return PlatformPatterns.psiElement()
11731184
.afterLeafSkipping(
11741185
PlatformPatterns.or(
@@ -1180,6 +1191,23 @@ public static ElementPattern<PsiElement> getFilterPattern() {
11801191
.withLanguage(TwigLanguage.INSTANCE);
11811192
}
11821193

1194+
/**
1195+
* Since PhpStorm 2024.1 value can be nested inside TwigVariableReference element
1196+
*
1197+
* {% for user in users|de<caret> %}
1198+
*/
1199+
private static ElementPattern<PsiElement> getFilterAsVariableReferencePattern() {
1200+
return PlatformPatterns.psiElement()
1201+
.withParent(PlatformPatterns.psiElement(TwigVariableReference.class).afterLeafSkipping(
1202+
PlatformPatterns.or(
1203+
PlatformPatterns.psiElement(PsiWhiteSpace.class),
1204+
PlatformPatterns.psiElement(TwigTokenTypes.WHITE_SPACE)
1205+
),
1206+
PlatformPatterns.psiElement().withElementType(TwigTokenTypes.FILTER)
1207+
))
1208+
.withLanguage(TwigLanguage.INSTANCE);
1209+
}
1210+
11831211
/**
11841212
* {% apply <caret> %}foobar{% endapply %}
11851213
*/

src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/TwigTemplateCompletionContributor.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import com.intellij.psi.PsiElement;
1414
import com.intellij.psi.PsiFile;
1515
import com.intellij.psi.PsiReference;
16-
import com.intellij.psi.PsiWhiteSpace;
1716
import com.intellij.psi.util.PsiTreeUtil;
1817
import com.intellij.util.PlatformIcons;
1918
import com.intellij.util.ProcessingContext;
@@ -562,24 +561,15 @@ private boolean isCompletionStartingRegexMatch(@RegExp String fullText, @NotNull
562561

563562
private static class FilterCompletionProvider extends CompletionProvider<CompletionParameters> {
564563
public void addCompletions(@NotNull CompletionParameters parameters, @NotNull ProcessingContext context, @NotNull CompletionResultSet resultSet) {
565-
if(!Symfony2ProjectComponent.isEnabled(parameters.getPosition())) {
564+
if (!Symfony2ProjectComponent.isEnabled(parameters.getPosition())) {
566565
return;
567566
}
568567

569-
// move this stuff to pattern fixed event stopping by phpstorm
570-
PsiElement currElement = parameters.getPosition().getOriginalElement();
571-
PsiElement prevElement = currElement.getPrevSibling();
572-
if (((prevElement instanceof PsiWhiteSpace))) prevElement = prevElement.getPrevSibling();
573-
574-
if ((prevElement != null) && (prevElement.getNode().getElementType() == TwigTokenTypes.FILTER)) {
575-
Project project = parameters.getPosition().getProject();
576-
577-
for(Map.Entry<String, TwigExtension> entry : TwigExtensionParser.getFilters(project).entrySet()) {
578-
TwigExtension twigExtension = entry.getValue();
579-
resultSet.addElement(new TwigExtensionLookupElement(currElement.getProject(), entry.getKey(), twigExtension));
580-
581-
resultSet.addAllElements(getTypesFilters(project, entry.getKey(), entry.getValue()));
582-
}
568+
Project project = parameters.getPosition().getProject();
569+
for (Map.Entry<String, TwigExtension> entry : TwigExtensionParser.getFilters(project).entrySet()) {
570+
TwigExtension twigExtension = entry.getValue();
571+
resultSet.addElement(new TwigExtensionLookupElement(project, entry.getKey(), twigExtension));
572+
resultSet.addAllElements(getTypesFilters(project, entry.getKey(), entry.getValue()));
583573
}
584574
}
585575
}

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/templating/TwigPatternTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,4 +465,12 @@ public void testGetForTagInVariablePattern() {
465465
PsiElement elementAt4 = findElementAt(TwigFileType.INSTANCE, "{% for key, user in <caret>|test('test') %}");
466466
assertTrue(TwigPattern.getForTagInVariablePattern().accepts(elementAt4));
467467
}
468+
469+
public void testGetFilterPattern() {
470+
PsiElement elementAt = findElementAt(TwigFileType.INSTANCE, "{{ 'f<caret>oo'|tr<caret>ans }}");
471+
assertTrue(TwigPattern.getFilterPattern().accepts(elementAt));
472+
473+
PsiElement elementAt2 = findElementAt(TwigFileType.INSTANCE, "{% for user in foo|tr<caret>a %}").getParent();
474+
assertTrue(TwigPattern.getFilterPattern().accepts(elementAt2));
475+
}
468476
}

0 commit comments

Comments
 (0)