Skip to content

Commit e884c0c

Browse files
authored
Merge pull request #2097 from Haehnchen/feature/twig-extends
replace recursive visiting for twig extends indexer
2 parents 6caa8c9 + ad723af commit e884c0c

File tree

2 files changed

+33
-20
lines changed

2 files changed

+33
-20
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/templating/util/TwigUtil.java

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2807,29 +2807,38 @@ public static Collection<LookupElement> getBlockLookupElements(@NotNull Project
28072807
return lookupElements;
28082808
}
28092809

2810-
public static void visitTemplateExtends(@NotNull TwigFile twigFile,@NotNull Consumer<Pair<String, PsiElement>> consumer) {
2811-
twigFile.acceptChildren(new PsiRecursiveElementWalkingVisitor() {
2812-
@Override
2813-
public void visitElement(PsiElement element) {
2814-
if (element instanceof TwigExtendsTag) {
2815-
for (String s : TwigUtil.getTwigExtendsTagTemplates((TwigExtendsTag) element)) {
2816-
consumer.consume(Pair.create(TwigUtil.normalizeTemplateName(s), element));
2817-
}
2810+
public static void visitTemplateExtends(@NotNull TwigFile twigFile, @NotNull Consumer<Pair<String, PsiElement>> consumer) {
2811+
for (PsiElement element : twigFile.getChildren()) {
2812+
// "extends" must not be nested, support 1 level at least for invalid files
2813+
if (element instanceof TwigBlockStatement || element.getNode().getElementType() == TwigElementTypes.IF_STATEMENT) {
2814+
for (PsiElement child : element.getChildren()) {
2815+
visitTemplateExtendsConsumer(child, consumer);
28182816
}
28192817

2820-
for (TwigFileUsage extension : TWIG_FILE_USAGE_EXTENSIONS.getExtensions()) {
2821-
if (!extension.isExtendsTemplate(element)) {
2822-
continue;
2823-
}
2818+
continue;
2819+
}
28242820

2825-
for (String template : extension.getExtendsTemplate(element)) {
2826-
consumer.consume(Pair.create(TwigUtil.normalizeTemplateName(template), element));
2827-
}
2828-
}
2821+
visitTemplateExtendsConsumer(element, consumer);
2822+
}
2823+
}
28292824

2830-
super.visitElement(element);
2825+
private static void visitTemplateExtendsConsumer(@NotNull PsiElement element, @NotNull Consumer<Pair<String, PsiElement>> consumer) {
2826+
if (element instanceof TwigExtendsTag) {
2827+
for (String s : TwigUtil.getTwigExtendsTagTemplates((TwigExtendsTag) element)) {
2828+
String first = TwigUtil.normalizeTemplateName(s);
2829+
consumer.consume(new Pair<>(first, element));
28312830
}
2832-
});
2831+
}
2832+
2833+
for (TwigFileUsage extension : TWIG_FILE_USAGE_EXTENSIONS.getExtensions()) {
2834+
if (!extension.isExtendsTemplate(element)) {
2835+
continue;
2836+
}
2837+
2838+
for (String template : extension.getExtendsTemplate(element)) {
2839+
consumer.consume(Pair.create(TwigUtil.normalizeTemplateName(template), element));
2840+
}
2841+
}
28332842
}
28342843

28352844
public static List<String> getIncludeTemplateUsageAsOrderedList(@NotNull Project project) {

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/TwigExtendsStubIndexTest.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ public void setUp() throws Exception {
1818
"{% extends '@Bar/extends.html.twig' %}\n" +
1919
"{% extends '@!Bar/extends_overwrite.html.twig' %}\n" +
2020
"{% extends ajax ? 'extends_statement_0.html.twig' : 'extends_statement_1.html.twig' %}\n" +
21-
"{% extends request.ajax ? foo ~ \"extends_statement_2.html.twig\" : \"extends_statement_3.html.twig\" %}\n"
21+
"{% extends request.ajax ? foo ~ \"extends_statement_2.html.twig\" : \"extends_statement_3.html.twig\" %}\n" +
22+
23+
// invalid cases to support
24+
"{% if '' %}{% extends 'extends_nested_if.html.twig' %}{% endif %}\n" +
25+
"{% block foo %}{% extends 'extends_nested_block.html.twig' %}{% endblock %}\n"
2226
);
2327
}
2428

@@ -28,7 +32,7 @@ public void setUp() throws Exception {
2832
public void testTemplateExtendsIndexer() {
2933
assertIndexContains(TwigExtendsStubIndex.KEY,
3034
"extends.html.twig", "extends_statement_0.html.twig", "extends_statement_1.html.twig",
31-
"extends_statement_3.html.twig", "@Bar/extends_overwrite.html.twig"
35+
"extends_statement_3.html.twig", "@Bar/extends_overwrite.html.twig", "extends_nested_if.html.twig", "extends_nested_block.html.twig"
3236
);
3337

3438
assertIndexNotContains(TwigExtendsStubIndex.KEY,

0 commit comments

Comments
 (0)