Skip to content

Commit 2d25b90

Browse files
authored
Merge pull request #2361 from Haehnchen/feature/service-missing-inspection-language
split MissingServiceInspection into language implentations to reduce wall time calls
2 parents ce718b8 + 92500f3 commit 2d25b90

File tree

4 files changed

+89
-55
lines changed

4 files changed

+89
-55
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/dic/inspection/MissingServiceInspection.java

Lines changed: 73 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,81 +17,102 @@
1717
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
1818
import org.apache.commons.lang3.StringUtils;
1919
import org.jetbrains.annotations.NotNull;
20-
import org.jetbrains.yaml.YAMLLanguage;
2120

2221
/**
2322
* @author Daniel Espendiller <daniel@espendiller.net>
2423
*/
25-
public class MissingServiceInspection extends LocalInspectionTool {
24+
public class MissingServiceInspection {
2625

2726
public static final String INSPECTION_MESSAGE = "Symfony: Missing Service";
2827

29-
@NotNull
30-
public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) {
31-
if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) {
32-
return super.buildVisitor(holder, isOnTheFly);
33-
}
28+
public static class PhpLocalInspectionTool extends LocalInspectionTool {
29+
@Override
30+
public @NotNull PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
31+
if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) {
32+
return super.buildVisitor(holder, isOnTheFly);
33+
}
3434

35-
return new MyPsiElementVisitor(holder);
36-
}
35+
return new PsiElementVisitor() {
36+
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
37+
38+
@Override
39+
public void visitElement(@NotNull PsiElement element) {
40+
if(element.getLanguage() == PhpLanguage.INSTANCE && element instanceof StringLiteralExpression) {
41+
// PHP
42+
MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter((StringLiteralExpression) element);
43+
if (methodReference != null && PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, ServiceContainerUtil.SERVICE_GET_SIGNATURES)) {
44+
String serviceName = PhpElementsUtil.getFirstArgumentStringValue(methodReference);
45+
if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) {
46+
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
47+
}
48+
}
49+
50+
// #[Autowire(service: 'foobar')]
51+
PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression((StringLiteralExpression) element);
52+
53+
boolean isAttributeLeaf = leafText != null && (
54+
PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText)
55+
|| PhpElementsUtil.getFirstAttributeStringPattern(ServiceContainerUtil.DECORATOR_ATTRIBUTE_CLASS).accepts(leafText)
56+
);
57+
58+
if (isAttributeLeaf) {
59+
String serviceName = ((StringLiteralExpression) element).getContents();
60+
if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) {
61+
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
62+
}
63+
}
3764

38-
private static class MyPsiElementVisitor extends PsiElementVisitor {
39-
private final ProblemsHolder holder;
40-
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
65+
}
4166

42-
MyPsiElementVisitor(@NotNull ProblemsHolder holder) {
43-
this.holder = holder;
44-
}
67+
super.visitElement(element);
68+
}
4569

46-
@Override
47-
public void visitElement(PsiElement element) {
48-
if(element.getLanguage() == PhpLanguage.INSTANCE && element instanceof StringLiteralExpression) {
49-
// PHP
50-
MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter((StringLiteralExpression) element);
51-
if (methodReference != null && PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, ServiceContainerUtil.SERVICE_GET_SIGNATURES)) {
52-
String serviceName = PhpElementsUtil.getFirstArgumentStringValue(methodReference);
53-
if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) {
54-
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
70+
private boolean hasService(@NotNull String serviceName) {
71+
if (this.lazyServiceCollector == null) {
72+
this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject());
5573
}
74+
75+
return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName);
5676
}
77+
};
5778

58-
// #[Autowire(service: 'foobar')]
59-
PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression((StringLiteralExpression) element);
79+
}
6080

61-
boolean isAttributeLeaf = leafText != null && (
62-
PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText)
63-
|| PhpElementsUtil.getFirstAttributeStringPattern(ServiceContainerUtil.DECORATOR_ATTRIBUTE_CLASS).accepts(leafText)
64-
);
81+
}
6582

66-
if (isAttributeLeaf) {
67-
String serviceName = ((StringLiteralExpression) element).getContents();
68-
if (StringUtils.isNotBlank(serviceName) && !hasService(serviceName)) {
69-
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
70-
}
71-
}
7283

73-
} else if(element.getLanguage() == YAMLLanguage.INSTANCE) {
74-
// yaml
84+
public static class YamlLocalInspectionTool extends LocalInspectionTool {
85+
@Override
86+
public @NotNull PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
87+
if (!Symfony2ProjectComponent.isEnabled(holder.getProject())) {
88+
return super.buildVisitor(holder, isOnTheFly);
89+
}
90+
91+
return new PsiElementVisitor() {
92+
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
7593

76-
if (YamlElementPatternHelper.getServiceDefinition().accepts(element) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(element)) {
77-
String serviceName = YamlHelper.trimSpecialSyntaxServiceName(PsiElementUtils.getText(element));
94+
@Override
95+
public void visitElement(@NotNull PsiElement element) {
96+
if (YamlElementPatternHelper.getServiceDefinition().accepts(element) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(element)) {
97+
String serviceName = YamlHelper.trimSpecialSyntaxServiceName(PsiElementUtils.getText(element));
7898

79-
// dont mark "@", "@?", "@@" escaping and expressions
80-
if (serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@") && !hasService(serviceName)) {
81-
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
99+
// dont mark "@", "@?", "@@" escaping and expressions
100+
if (serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@") && !hasService(serviceName)) {
101+
holder.registerProblem(element, INSPECTION_MESSAGE, ProblemHighlightType.GENERIC_ERROR_OR_WARNING);
102+
}
82103
}
83-
}
84-
}
85104

86-
super.visitElement(element);
87-
}
105+
super.visitElement(element);
106+
}
88107

89-
private boolean hasService(@NotNull String serviceName) {
90-
if (this.lazyServiceCollector == null) {
91-
this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject());
92-
}
108+
private boolean hasService(@NotNull String serviceName) {
109+
if (this.lazyServiceCollector == null) {
110+
this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(holder.getProject());
111+
}
93112

94-
return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName);
113+
return ContainerCollectionResolver.hasServiceName(lazyServiceCollector, serviceName);
114+
}
115+
};
95116
}
96117
}
97118
}

src/main/resources/META-INF/plugin.xml

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,19 @@
472472
language="PHP"
473473
implementationClass="fr.adrienbrault.idea.symfony2plugin.templating.PhpTemplateMissingInspection"/>
474474

475-
<localInspection groupPath="Symfony" shortName="MissingService" displayName="Missing Service"
475+
<localInspection groupPath="Symfony" shortName="MissingServiceXml" displayName="Missing Service in XML definition"
476476
groupName="Service"
477477
enabledByDefault="true"
478478
level="WARNING"
479-
implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.inspection.MissingServiceInspection"/>
479+
language="PHP"
480+
implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.inspection.MissingServiceInspection$PhpLocalInspectionTool"/>
481+
482+
<localInspection groupPath="Symfony" shortName="MissingServiceYaml" displayName="Missing Service in yaml definition"
483+
groupName="Service"
484+
enabledByDefault="true"
485+
level="WARNING"
486+
language="yaml"
487+
implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.inspection.MissingServiceInspection$YamlLocalInspectionTool"/>
480488

481489
<localInspection groupPath="Symfony" shortName="XmlServiceInstanceInspection" displayName="XML: Wrong Service Instance"
482490
groupName="Service"
@@ -549,7 +557,7 @@
549557
language="PHP"
550558
implementationClass="fr.adrienbrault.idea.symfony2plugin.templating.inspection.TemplateExistsAnnotationPhpAttributeLocalInspection"/>
551559

552-
<localInspection groupPath="Symfony" shortName="RouteControllerDeprecatedInspectionXml" displayName="Deprecated Action in XML Definition"
560+
<localInspection groupPath="Symfony" shortName="RouteControllerDeprecatedInspectionXml" displayName="Deprecated Action in XML definition"
553561
groupName="Route"
554562
enabledByDefault="true"
555563
level="WARNING"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<html>
2+
<body>
3+
No Symfony service with given id was found. See <a href="https://symfony.com/doc/current/service_container.html?phpstorm">Symfony documentation</a> for more help
4+
</body>
5+
</html>

0 commit comments

Comments
 (0)