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 666a34877..3b8c80090 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 @@ -17,81 +17,102 @@ import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; -import org.jetbrains.yaml.YAMLLanguage; /** * @author Daniel Espendiller */ -public class MissingServiceInspection extends LocalInspectionTool { +public class MissingServiceInspection { public static final String INSPECTION_MESSAGE = "Symfony: Missing Service"; - @NotNull - public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) { - if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) { - return super.buildVisitor(holder, isOnTheFly); - } + public static class PhpLocalInspectionTool extends LocalInspectionTool { + @Override + public @NotNull PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) { + return super.buildVisitor(holder, isOnTheFly); + } - return new MyPsiElementVisitor(holder); - } + return new PsiElementVisitor() { + private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector; + + @Override + public void visitElement(@NotNull PsiElement element) { + if(element.getLanguage() == PhpLanguage.INSTANCE && element instanceof StringLiteralExpression) { + // PHP + 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) && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + } + } + + // #[Autowire(service: 'foobar')] + PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression((StringLiteralExpression) element); + + boolean isAttributeLeaf = leafText != null && ( + PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText) + || PhpElementsUtil.getFirstAttributeStringPattern(ServiceContainerUtil.DECORATOR_ATTRIBUTE_CLASS).accepts(leafText) + ); + + if (isAttributeLeaf) { + String serviceName = ((StringLiteralExpression) element).getContents(); + if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + } + } - private static class MyPsiElementVisitor extends PsiElementVisitor { - private final ProblemsHolder holder; - private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector; + } - MyPsiElementVisitor(@NotNull ProblemsHolder holder) { - this.holder = holder; - } + super.visitElement(element); + } - @Override - public void visitElement(PsiElement element) { - if(element.getLanguage() == PhpLanguage.INSTANCE && element instanceof StringLiteralExpression) { - // PHP - 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) && !hasService(serviceName)) { - holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + private boolean hasService(@NotNull String serviceName) { + if (this.lazyServiceCollector == null) { + this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject()); } + + return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName); } + }; - // #[Autowire(service: 'foobar')] - PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression((StringLiteralExpression) element); + } - boolean isAttributeLeaf = leafText != null && ( - PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText) - || PhpElementsUtil.getFirstAttributeStringPattern(ServiceContainerUtil.DECORATOR_ATTRIBUTE_CLASS).accepts(leafText) - ); + } - if (isAttributeLeaf) { - 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 + public static class YamlLocalInspectionTool extends LocalInspectionTool { + @Override + public @NotNull PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { + if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) { + return super.buildVisitor(holder, isOnTheFly); + } + + return new PsiElementVisitor() { + private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector; - if (YamlElementPatternHelper.getServiceDefinition().accepts(element) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(element)) { - String serviceName = YamlHelper.trimSpecialSyntaxServiceName(PsiElementUtils.getText(element)); + @Override + public void visitElement(@NotNull PsiElement 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("@") && !hasService(serviceName)) { - holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + // dont mark "@", "@?", "@@" escaping and expressions + if (serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@") && !hasService(serviceName)) { + holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING); + } } - } - } - super.visitElement(element); - } + super.visitElement(element); + } - private boolean hasService(@NotNull String serviceName) { - if (this.lazyServiceCollector == null) { - this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject()); - } + private boolean hasService(@NotNull String serviceName) { + if (this.lazyServiceCollector == null) { + this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject()); + } - return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName); + return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName); + } + }; } } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 284cd4102..b7a1814f4 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -472,11 +472,19 @@ language="PHP" implementationClass="fr.adrienbrault.idea.symfony2plugin.templating.PhpTemplateMissingInspection"/> - + language="PHP" + implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.inspection.MissingServiceInspection$PhpLocalInspectionTool"/> + + - + +No Symfony service with given id was found. See Symfony documentation for more help + + \ No newline at end of file