From 7fc5555f22dc3df7f1e34e8c4c7e59d54339c39e Mon Sep 17 00:00:00 2001 From: Daniel Espendiller Date: Thu, 11 Jun 2020 12:06:52 +0200 Subject: [PATCH] support global Symfony DIC function: "service" and "param" --- .../php/PhpConfigReferenceContributor.java | 16 +++++++++++++ .../registrar/DicGotoCompletionRegistrar.java | 16 ++++++++++--- .../symfony2plugin/util/PhpElementsUtil.java | 23 +++++++++++++++++++ .../PhpStringLiteralExpressionReference.java | 6 ++--- .../PhpConfigReferenceContributorTest.java | 1 + .../tests/config/php/fixtures/services.yml | 2 ++ .../DicGotoCompletionRegistrarTest.java | 12 ++++++++++ 7 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/fixtures/services.yml diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/php/PhpConfigReferenceContributor.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/php/PhpConfigReferenceContributor.java index 0373e349e..33760d33d 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/php/PhpConfigReferenceContributor.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/php/PhpConfigReferenceContributor.java @@ -84,6 +84,22 @@ public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @No } ); + // service(''), ref('') (ref is deprecated) + psiReferenceRegistrar.registerReferenceProvider( + PhpElementsUtil.getFunctionWithFirstStringPattern("service", "ref"), + new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { + if (!Symfony2ProjectComponent.isEnabled(psiElement)) { + return new PsiReference[0]; + } + + return new PsiReference[]{ new ServiceReference((StringLiteralExpression) psiElement, true) }; + } + } + ); + psiReferenceRegistrar.registerReferenceProvider( PlatformPatterns.psiElement(StringLiteralExpression.class).withLanguage(PhpLanguage.INSTANCE), new PsiReferenceProvider() { diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/registrar/DicGotoCompletionRegistrar.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/registrar/DicGotoCompletionRegistrar.java index 8df775d0b..f6fa50519 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/registrar/DicGotoCompletionRegistrar.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/registrar/DicGotoCompletionRegistrar.java @@ -1,7 +1,7 @@ package fr.adrienbrault.idea.symfony2plugin.dic.registrar; import com.intellij.codeInsight.lookup.LookupElement; -import com.intellij.patterns.XmlPatterns; +import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiElement; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider; @@ -28,10 +28,9 @@ public class DicGotoCompletionRegistrar implements GotoCompletionRegistrar { @Override public void register(@NotNull GotoCompletionRegistrarParameter registrar) { - // getParameter('FOO') registrar.register( - XmlPatterns.psiElement().withParent(PhpElementsUtil.getMethodWithFirstStringPattern()), psiElement -> { + PlatformPatterns.psiElement().withParent(PhpElementsUtil.getMethodWithFirstStringPattern()), psiElement -> { PsiElement context = psiElement.getContext(); if (!(context instanceof StringLiteralExpression)) { @@ -52,6 +51,17 @@ public void register(@NotNull GotoCompletionRegistrarParameter registrar) { } ); + // param('') + registrar.register( + PlatformPatterns.psiElement().withParent(PhpElementsUtil.getFunctionWithFirstStringPattern("param")), psiElement -> { + PsiElement context = psiElement.getContext(); + if (!(context instanceof StringLiteralExpression)) { + return null; + } + + return new ParameterContributor((StringLiteralExpression) context); + } + ); } private static class ParameterContributor extends GotoCompletionProvider { diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java index 73a2681e7..5c3b3d301 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpElementsUtil.java @@ -3,10 +3,12 @@ import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.openapi.project.Project; import com.intellij.patterns.ElementPattern; +import com.intellij.patterns.PatternCondition; import com.intellij.patterns.PlatformPatterns; import com.intellij.patterns.PsiElementPattern; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.ProcessingContext; import com.intellij.util.Processor; import com.jetbrains.php.PhpIndex; import com.jetbrains.php.codeInsight.PhpCodeInsightUtil; @@ -29,6 +31,7 @@ import fr.adrienbrault.idea.symfony2plugin.dic.MethodReferenceBag; import fr.adrienbrault.idea.symfony2plugin.util.psi.PsiElementAssertUtil; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -296,6 +299,26 @@ static public PsiElementPattern.Capture getMethodWithFi .withLanguage(PhpLanguage.INSTANCE); } + static public PsiElementPattern.Capture getFunctionWithFirstStringPattern(@NotNull String... functionName) { + return PlatformPatterns + .psiElement(StringLiteralExpression.class) + .withParent( + PlatformPatterns.psiElement(ParameterList.class) + .withFirstChild( + PlatformPatterns.psiElement(PhpElementTypes.STRING) + ) + .withParent( + PlatformPatterns.psiElement(FunctionReference.class).with(new PatternCondition("function match") { + @Override + public boolean accepts(@NotNull FunctionReference functionReference, ProcessingContext processingContext) { + return ArrayUtils.contains(functionName, functionReference.getName()); + } + }) + ) + ) + .withLanguage(PhpLanguage.INSTANCE); + } + /** * $foo->bar('') */ diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpStringLiteralExpressionReference.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpStringLiteralExpressionReference.java index 6cd046c48..870ba292b 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpStringLiteralExpressionReference.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpStringLiteralExpressionReference.java @@ -69,9 +69,9 @@ private PsiReference[] getPsiReferenceBase(PsiElement psiElement) { return new PsiReference[0]; } - private class Call { - private String className; - private String methodName; + private static class Call { + private final String className; + private final String methodName; private int index = 0; public Call(String className, String methodName) { diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/PhpConfigReferenceContributorTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/PhpConfigReferenceContributorTest.java index bc64159f9..4c9ac8dab 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/PhpConfigReferenceContributorTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/PhpConfigReferenceContributorTest.java @@ -12,6 +12,7 @@ public void setUp() throws Exception { super.setUp(); myFixture.copyFileToProject("classes.php"); myFixture.copyFileToProject("tags.yml"); + myFixture.copyFileToProject("services.yml"); } public String getTestDataPath() { diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/fixtures/services.yml b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/fixtures/services.yml new file mode 100644 index 000000000..92181f7de --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/php/fixtures/services.yml @@ -0,0 +1,2 @@ +services: + my_nice_service: ~ \ No newline at end of file diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/registrar/DicGotoCompletionRegistrarTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/registrar/DicGotoCompletionRegistrarTest.java index 60ab1d101..36cf9967a 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/registrar/DicGotoCompletionRegistrarTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/registrar/DicGotoCompletionRegistrarTest.java @@ -51,4 +51,16 @@ public void testParameterContributorProxied() { ); } } + + public void testParameterContributorFor() { + assertCompletionContains(PhpFileType.INSTANCE, "')", + "foo" + ); + + assertNavigationMatch(PhpFileType.INSTANCE, "o')", + PlatformPatterns.psiElement() + ); + } }