Skip to content

Commit 7f70e18

Browse files
committed
support coalesce and ternary resolving in template name usage for php
1 parent d552439 commit 7f70e18

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

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -87,37 +87,67 @@ private void visitMethodReference(@NotNull MethodReference methodReference) {
8787
}
8888

8989
if (parameters[0] instanceof StringLiteralExpression) {
90-
// foo('foo.html.twig')
91-
String contents = ((StringLiteralExpression) parameters[0]).getContents();
92-
if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) {
93-
return;
94-
}
90+
resolveString(methodReference, parameters[0]);
91+
} else if(parameters[0] instanceof TernaryExpression) {
92+
// render(true === true ? 'foo.twig.html' : 'foobar.twig.html')
93+
for (PhpPsiElement phpPsiElement : new PhpPsiElement[]{((TernaryExpression) parameters[0]).getTrueVariant(), ((TernaryExpression) parameters[0]).getFalseVariant()}) {
94+
if (phpPsiElement == null) {
95+
continue;
96+
}
9597

96-
Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class);
97-
if(parentOfType == null) {
98-
return;
98+
if (phpPsiElement instanceof StringLiteralExpression) {
99+
resolveString(methodReference, phpPsiElement);
100+
} else if(phpPsiElement instanceof PhpReference) {
101+
resolvePhpReference(methodReference, phpPsiElement);
102+
}
99103
}
100-
101-
addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\"));
102104
} else if(parameters[0] instanceof PhpReference) {
103-
for (PhpNamedElement phpNamedElement : ((PhpReference) parameters[0]).resolveLocal()) {
104-
// foo(self::foo)
105-
// foo($this->foo)
106-
if (phpNamedElement instanceof Field) {
107-
PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue();
108-
if (defaultValue instanceof StringLiteralExpression) {
109-
addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue);
110-
}
105+
resolvePhpReference(methodReference, parameters[0]);
106+
} else if(parameters[0] instanceof BinaryExpression) {
107+
// render($foo ?? 'foo.twig.html')
108+
PsiElement phpPsiElement = ((BinaryExpression) parameters[0]).getRightOperand();
109+
110+
if (phpPsiElement instanceof StringLiteralExpression) {
111+
resolveString(methodReference, phpPsiElement);
112+
} else if(phpPsiElement instanceof PhpReference) {
113+
resolvePhpReference(methodReference, phpPsiElement);
114+
}
115+
}
116+
}
117+
118+
private void resolveString(@NotNull MethodReference methodReference, PsiElement parameter) {
119+
// foo('foo.html.twig')
120+
String contents = ((StringLiteralExpression) parameter).getContents();
121+
if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) {
122+
return;
123+
}
124+
125+
Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class);
126+
if(parentOfType == null) {
127+
return;
128+
}
129+
130+
addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\"));
131+
}
132+
133+
private void resolvePhpReference(@NotNull MethodReference methodReference, PsiElement parameter) {
134+
for (PhpNamedElement phpNamedElement : ((PhpReference) parameter).resolveLocal()) {
135+
// foo(self::foo)
136+
// foo($this->foo)
137+
if (phpNamedElement instanceof Field) {
138+
PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue();
139+
if (defaultValue instanceof StringLiteralExpression) {
140+
addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue);
111141
}
142+
}
112143

113-
// foo($var) => $var = 'test.html.twig'
114-
if (phpNamedElement instanceof Variable) {
115-
PsiElement assignmentExpression = phpNamedElement.getParent();
116-
if (assignmentExpression instanceof AssignmentExpression) {
117-
PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue();
118-
if (value instanceof StringLiteralExpression) {
119-
addStringLiteralScope(methodReference, (StringLiteralExpression) value);
120-
}
144+
// foo($var) => $var = 'test.html.twig'
145+
if (phpNamedElement instanceof Variable) {
146+
PsiElement assignmentExpression = phpNamedElement.getParent();
147+
if (assignmentExpression instanceof AssignmentExpression) {
148+
PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue();
149+
if (value instanceof StringLiteralExpression) {
150+
addStringLiteralScope(methodReference, (StringLiteralExpression) value);
121151
}
122152
}
123153
}

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

Lines changed: 7 additions & 1 deletion
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)