diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/inspection/MissingServiceInspection.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/inspection/MissingServiceInspection.java index fe9a97bf8..5f1195311 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/inspection/MissingServiceInspection.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/inspection/MissingServiceInspection.java @@ -6,6 +6,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.jetbrains.php.lang.PhpLanguage; +import com.jetbrains.php.lang.lexer.PhpTokenTypes; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; @@ -19,6 +20,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLLanguage; +import java.util.Arrays; + /** * @author Daniel Espendiller */ @@ -50,23 +53,34 @@ public void visitElement(PsiElement element) { MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter((StringLiteralExpression) element); if (methodReference != null && PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, ServiceContainerUtil.SERVICE_GET_SIGNATURES)) { String serviceName = PhpElementsUtil.getFirstArgumentStringValue(methodReference); - if(StringUtils.isNotBlank(serviceName)) { - if(!hasService(serviceName)) { - holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); - } + if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + } + } + + // #[Autowire(service: 'foobar')] + // get leaf element + PsiElement leafText = Arrays.stream(YamlHelper.getChildrenFix(element)) + .filter(p -> p.getNode().getElementType() == PhpTokenTypes.STRING_LITERAL_SINGLE_QUOTE || p.getNode().getElementType() == PhpTokenTypes.STRING_LITERAL) + .findFirst() + .orElse(null); + + if (leafText != null && PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText)) { + String serviceName = ((StringLiteralExpression) element).getContents(); + if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } } + } else if(element.getLanguage() == YAMLLanguage.INSTANCE) { // yaml - if(YamlElementPatternHelper.getServiceDefinition().accepts(element) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(element)) { + if (YamlElementPatternHelper.getServiceDefinition().accepts(element) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(element)) { String serviceName = YamlHelper.trimSpecialSyntaxServiceName(PsiElementUtils.getText(element)); // dont mark "@", "@?", "@@" escaping and expressions - if(serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@")) { - if(!hasService(serviceName)) { - holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); - } + if (serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@") && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); } } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/MissingServiceInspectionTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/MissingServiceInspectionTest.java index 3667ed7ff..3f8317f47 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/MissingServiceInspectionTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/MissingServiceInspectionTest.java @@ -32,6 +32,32 @@ public void testThatPhpServiceInterfaceForGetMethodIsInspected() { ); } + public void testThatPhpAttributesForServiceAutowireIsInspected() { + assertLocalInspectionContains("test.php", "obar')]" + + " ) {}\n" + + "}", + MissingServiceInspection.INSPECTION_MESSAGE + ); + + assertLocalInspectionContains("test.php", "obar\")]" + + " ) {}\n" + + "}", + MissingServiceInspection.INSPECTION_MESSAGE + ); + } + public void testThatYamlServiceInterfaceForGetMethodIsInspected() { assertLocalInspectionContains("services.yml", "services:\n @args_unknown", MissingServiceInspection.INSPECTION_MESSAGE); assertLocalInspectionContains("services.yml", "services:\n @Args_unknown", MissingServiceInspection.INSPECTION_MESSAGE); diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/fixtures/classes.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/fixtures/classes.php index 8a7418fa9..61bb3af13 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/fixtures/classes.php +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/dic/inspection/fixtures/classes.php @@ -21,4 +21,9 @@ public function __construct($foobar) { } } +} + +namespace Symfony\Component\DependencyInjection\Attribute +{ + class Autowire {} } \ No newline at end of file