Skip to content

Commit 1df05d0

Browse files
authored
Merge pull request Haehnchen#1354 from Haehnchen/feature/template-binary-expression
support coalesce and ternary resolving in template name usage for php
2 parents 5327f1a + 7f70e18 commit 1df05d0

File tree

2 files changed

+63
-27
lines changed

2 files changed

+63
-27
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/PhpTwigTemplateUsageStubIndex.java

+56-26
Original file line numberDiff line numberDiff line change
@@ -107,37 +107,67 @@ private void visitMethodReference(@NotNull MethodReference methodReference) {
107107
}
108108

109109
if (parameters[0] instanceof StringLiteralExpression) {
110-
// foo('foo.html.twig')
111-
String contents = ((StringLiteralExpression) parameters[0]).getContents();
112-
if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) {
113-
return;
114-
}
110+
resolveString(methodReference, parameters[0]);
111+
} else if(parameters[0] instanceof TernaryExpression) {
112+
// render(true === true ? 'foo.twig.html' : 'foobar.twig.html')
113+
for (PhpPsiElement phpPsiElement : new PhpPsiElement[]{((TernaryExpression) parameters[0]).getTrueVariant(), ((TernaryExpression) parameters[0]).getFalseVariant()}) {
114+
if (phpPsiElement == null) {
115+
continue;
116+
}
115117

116-
Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class);
117-
if(parentOfType == null) {
118-
return;
118+
if (phpPsiElement instanceof StringLiteralExpression) {
119+
resolveString(methodReference, phpPsiElement);
120+
} else if(phpPsiElement instanceof PhpReference) {
121+
resolvePhpReference(methodReference, phpPsiElement);
122+
}
119123
}
120-
121-
addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\"));
122124
} else if(parameters[0] instanceof PhpReference) {
123-
for (PhpNamedElement phpNamedElement : ((PhpReference) parameters[0]).resolveLocal()) {
124-
// foo(self::foo)
125-
// foo($this->foo)
126-
if (phpNamedElement instanceof Field) {
127-
PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue();
128-
if (defaultValue instanceof StringLiteralExpression) {
129-
addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue);
130-
}
125+
resolvePhpReference(methodReference, parameters[0]);
126+
} else if(parameters[0] instanceof BinaryExpression) {
127+
// render($foo ?? 'foo.twig.html')
128+
PsiElement phpPsiElement = ((BinaryExpression) parameters[0]).getRightOperand();
129+
130+
if (phpPsiElement instanceof StringLiteralExpression) {
131+
resolveString(methodReference, phpPsiElement);
132+
} else if(phpPsiElement instanceof PhpReference) {
133+
resolvePhpReference(methodReference, phpPsiElement);
134+
}
135+
}
136+
}
137+
138+
private void resolveString(@NotNull MethodReference methodReference, PsiElement parameter) {
139+
// foo('foo.html.twig')
140+
String contents = ((StringLiteralExpression) parameter).getContents();
141+
if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) {
142+
return;
143+
}
144+
145+
Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class);
146+
if(parentOfType == null) {
147+
return;
148+
}
149+
150+
addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\"));
151+
}
152+
153+
private void resolvePhpReference(@NotNull MethodReference methodReference, PsiElement parameter) {
154+
for (PhpNamedElement phpNamedElement : ((PhpReference) parameter).resolveLocal()) {
155+
// foo(self::foo)
156+
// foo($this->foo)
157+
if (phpNamedElement instanceof Field) {
158+
PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue();
159+
if (defaultValue instanceof StringLiteralExpression) {
160+
addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue);
131161
}
162+
}
132163

133-
// foo($var) => $var = 'test.html.twig'
134-
if (phpNamedElement instanceof Variable) {
135-
PsiElement assignmentExpression = phpNamedElement.getParent();
136-
if (assignmentExpression instanceof AssignmentExpression) {
137-
PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue();
138-
if (value instanceof StringLiteralExpression) {
139-
addStringLiteralScope(methodReference, (StringLiteralExpression) value);
140-
}
164+
// foo($var) => $var = 'test.html.twig'
165+
if (phpNamedElement instanceof Variable) {
166+
PsiElement assignmentExpression = phpNamedElement.getParent();
167+
if (assignmentExpression instanceof AssignmentExpression) {
168+
PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue();
169+
if (value instanceof StringLiteralExpression) {
170+
addStringLiteralScope(methodReference, (StringLiteralExpression) value);
141171
}
142172
}
143173
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,17 @@ public void testThatTwigRenderMethodsAreInIndex() {
1515
"class Foo\n" +
1616
"{\n" +
1717
" const FOO = 'const.html.twig';\n" +
18+
" const FOO_TERNARY = 'const-ternary.html.twig';\n" +
19+
" const FOO_COALESCE = 'const-coalesce.html.twig';\n" +
1820
" private $foo = 'private.html.twig';\n" +
1921
" public function foobar() {\n" +
2022
" $var = 'var.html.twig';\n" +
2123
" $foo->render('foo-render.html.twig');\n" +
2224
" $foo->render('foo-render.html.twig');\n" +
2325
" $foo->render('foobar-render.twig');\n" +
26+
" $foo->render(true === true ? 'foo-render-ternary.html.twig' : self::FOO_TERNARY);\n" +
27+
" $foo->render($foobar ?? 'foo-render-coalesce.html.twig');\n" +
28+
" $foo->render($foobar ?? self::FOO_COALESCE);\n" +
2429
" $foo->render('@!Foo/overwrite.html.twig');\n" +
2530
" $foo->renderView('foo-renderView.html.twig');\n" +
2631
" $foo->renderResponse('foo-renderResponse.html.twig');\n" +
@@ -40,7 +45,8 @@ public void testThatTwigRenderMethodsAreInIndex() {
4045
assertIndexContains(
4146
PhpTwigTemplateUsageStubIndex.KEY,
4247
"foo-render.html.twig", "foo-renderView.html.twig", "foo-renderResponse.html.twig",
43-
"@Foo/overwrite.html.twig", "const.html.twig", "var.html.twig", "private.html.twig", "foobar-render.twig"
48+
"@Foo/overwrite.html.twig", "const.html.twig", "var.html.twig", "private.html.twig", "foobar-render.twig",
49+
"foo-render-ternary.html.twig", "const-ternary.html.twig", "foo-render-coalesce.html.twig", "const-coalesce.html.twig"
4450
);
4551

4652
assertIndexContainsKeyWithValue(PhpTwigTemplateUsageStubIndex.KEY, "foo-render.html.twig", value ->

0 commit comments

Comments
 (0)