Skip to content

support coalesce and ternary resolving in template name usage for php #1354

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 3, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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" +
Expand All @@ -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 ->
Expand Down