diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/PhpTwigTemplateUsageStubIndex.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/PhpTwigTemplateUsageStubIndex.java index df882e4fa..6b767c188 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/PhpTwigTemplateUsageStubIndex.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/PhpTwigTemplateUsageStubIndex.java @@ -87,37 +87,67 @@ private void visitMethodReference(@NotNull MethodReference methodReference) { } if (parameters[0] instanceof StringLiteralExpression) { - // foo('foo.html.twig') - String contents = ((StringLiteralExpression) parameters[0]).getContents(); - if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) { - return; - } + resolveString(methodReference, parameters[0]); + } else if(parameters[0] instanceof TernaryExpression) { + // render(true === true ? 'foo.twig.html' : 'foobar.twig.html') + for (PhpPsiElement phpPsiElement : new PhpPsiElement[]{((TernaryExpression) parameters[0]).getTrueVariant(), ((TernaryExpression) parameters[0]).getFalseVariant()}) { + if (phpPsiElement == null) { + continue; + } - Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class); - if(parentOfType == null) { - return; + if (phpPsiElement instanceof StringLiteralExpression) { + resolveString(methodReference, phpPsiElement); + } else if(phpPsiElement instanceof PhpReference) { + resolvePhpReference(methodReference, phpPsiElement); + } } - - addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\")); } else if(parameters[0] instanceof PhpReference) { - for (PhpNamedElement phpNamedElement : ((PhpReference) parameters[0]).resolveLocal()) { - // foo(self::foo) - // foo($this->foo) - if (phpNamedElement instanceof Field) { - PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue(); - if (defaultValue instanceof StringLiteralExpression) { - addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue); - } + resolvePhpReference(methodReference, parameters[0]); + } else if(parameters[0] instanceof BinaryExpression) { + // render($foo ?? 'foo.twig.html') + PsiElement phpPsiElement = ((BinaryExpression) parameters[0]).getRightOperand(); + + if (phpPsiElement instanceof StringLiteralExpression) { + resolveString(methodReference, phpPsiElement); + } else if(phpPsiElement instanceof PhpReference) { + resolvePhpReference(methodReference, phpPsiElement); + } + } + } + + private void resolveString(@NotNull MethodReference methodReference, PsiElement parameter) { + // foo('foo.html.twig') + String contents = ((StringLiteralExpression) parameter).getContents(); + if (StringUtils.isBlank(contents) || !contents.endsWith(".twig")) { + return; + } + + Function parentOfType = PsiTreeUtil.getParentOfType(methodReference, Function.class); + if(parentOfType == null) { + return; + } + + addTemplateWithScope(contents, StringUtils.stripStart(parentOfType.getFQN(), "\\")); + } + + private void resolvePhpReference(@NotNull MethodReference methodReference, PsiElement parameter) { + for (PhpNamedElement phpNamedElement : ((PhpReference) parameter).resolveLocal()) { + // foo(self::foo) + // foo($this->foo) + if (phpNamedElement instanceof Field) { + PsiElement defaultValue = ((Field) phpNamedElement).getDefaultValue(); + if (defaultValue instanceof StringLiteralExpression) { + addStringLiteralScope(methodReference, (StringLiteralExpression) defaultValue); } + } - // foo($var) => $var = 'test.html.twig' - if (phpNamedElement instanceof Variable) { - PsiElement assignmentExpression = phpNamedElement.getParent(); - if (assignmentExpression instanceof AssignmentExpression) { - PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue(); - if (value instanceof StringLiteralExpression) { - addStringLiteralScope(methodReference, (StringLiteralExpression) value); - } + // foo($var) => $var = 'test.html.twig' + if (phpNamedElement instanceof Variable) { + PsiElement assignmentExpression = phpNamedElement.getParent(); + if (assignmentExpression instanceof AssignmentExpression) { + PhpPsiElement value = ((AssignmentExpression) assignmentExpression).getValue(); + if (value instanceof StringLiteralExpression) { + addStringLiteralScope(methodReference, (StringLiteralExpression) value); } } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/PhpTwigTemplateUsageStubIndexTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/PhpTwigTemplateUsageStubIndexTest.java index 441ce41ae..9a03da98b 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/PhpTwigTemplateUsageStubIndexTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/PhpTwigTemplateUsageStubIndexTest.java @@ -15,12 +15,17 @@ public void testThatTwigRenderMethodsAreInIndex() { "class Foo\n" + "{\n" + " const FOO = 'const.html.twig';\n" + + " const FOO_TERNARY = 'const-ternary.html.twig';\n" + + " const FOO_COALESCE = 'const-coalesce.html.twig';\n" + " private $foo = 'private.html.twig';\n" + " public function foobar() {\n" + " $var = 'var.html.twig';\n" + " $foo->render('foo-render.html.twig');\n" + " $foo->render('foo-render.html.twig');\n" + " $foo->render('foobar-render.twig');\n" + + " $foo->render(true === true ? 'foo-render-ternary.html.twig' : self::FOO_TERNARY);\n" + + " $foo->render($foobar ?? 'foo-render-coalesce.html.twig');\n" + + " $foo->render($foobar ?? self::FOO_COALESCE);\n" + " $foo->render('@!Foo/overwrite.html.twig');\n" + " $foo->renderView('foo-renderView.html.twig');\n" + " $foo->renderResponse('foo-renderResponse.html.twig');\n" + @@ -40,7 +45,8 @@ public void testThatTwigRenderMethodsAreInIndex() { assertIndexContains( PhpTwigTemplateUsageStubIndex.KEY, "foo-render.html.twig", "foo-renderView.html.twig", "foo-renderResponse.html.twig", - "@Foo/overwrite.html.twig", "const.html.twig", "var.html.twig", "private.html.twig", "foobar-render.twig" + "@Foo/overwrite.html.twig", "const.html.twig", "var.html.twig", "private.html.twig", "foobar-render.twig", + "foo-render-ternary.html.twig", "const-ternary.html.twig", "foo-render-coalesce.html.twig", "const-coalesce.html.twig" ); assertIndexContainsKeyWithValue(PhpTwigTemplateUsageStubIndex.KEY, "foo-render.html.twig", value ->