8000 add warning for service name if containing a upper char #537 · Koc/idea-php-symfony2-plugin@dedb7b6 · GitHub
[go: up one dir, main page]

Skip to content

Commit dedb7b6

Browse files
committed
add warning for service name if containing a upper char Haehnchen#537
1 parent c2644bd commit dedb7b6

File tree

4 files changed

+127
-0
lines changed

4 files changed

+127
-0
lines changed

META-INF/plugin.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,11 @@
381381
enabledByDefault="true" level="WARNING"
382382
implementationClass="fr.adrienbrault.idea.symfony2plugin.intentions.yaml.YamlServiceArgumentInspection"/>
383383

384+
<localInspection groupPath="Symfony" shortName="CaseSensitivityServiceInspection" displayName="Symfony: Service sensitivity"
385+
groupName="Service"
386+
enabledByDefault="true" level="WARNING"
387+
implementationClass="fr.adrienbrault.idea.symfony2plugin.dic.inspection.CaseSensitivityServiceInspection"/>
388+
384389
<intentionAction>
385390
<className>fr.adrienbrault.idea.symfony2plugin.intentions.php.PhpServiceIntention</className>
386391
<category>PHP</category>

src/fr/adrienbrault/idea/symfony2plugin/config/xml/XmlHelper.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,23 @@ public static XmlAttributeValuePattern getArgumentServiceIdPattern() {
9292
).inFile(XmlHelper.getXmlFilePattern());
9393
}
9494

95+
/**
96+
* <service id="service_container" />
97+
*/
98+
public static XmlAttributeValuePattern getServiceIdNamePattern() {
99+
return XmlPatterns
100+
.xmlAttributeValue()
101+
.withParent(XmlPatterns
102+
.xmlAttribute("id")
103+
.withParent(XmlPatterns
104+
.xmlTag()
105+
.withName("service")
106+
)
107+
).inside(
108+
XmlHelper.getInsideTagPattern("services")
109+
).inFile(XmlHelper.getXmlFilePattern());
110+
}
111+
95112
/**
96113
* <factory service="factory_service" method="createFooMethod" />
97114
*/
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package fr.adrienbrault.idea.symfony2plugin.dic.inspection;
2+
3+
import com.intellij.codeInspection.LocalInspectionTool;
4+
import com.intellij.codeInspection.ProblemHighlightType;
5+
import com.intellij.codeInspection.ProblemsHolder;
6+
import com.intellij.ide.highlighter.XmlFileType;
7+
import com.intellij.psi.PsiElement;
8+
import com.intellij.psi.PsiElementVisitor;
9+
import com.intellij.psi.PsiFile;
10+
import com.intellij.psi.PsiRecursiveElementVisitor;
11+
import com.intellij.psi.xml.XmlAttributeValue;
12+
import com.jetbrains.php.lang.PhpFileType;
13+
import com.jetbrains.php.lang.psi.elements.MethodReference;
14+
import fr.adrienbrault.idea.symfony2plugin.Symfony2InterfacesUtil;
15+
import fr.adrienbrault.idea.symfony2plugin.config.xml.XmlHelper;
16+
import fr.adrienbrault.idea.symfony2plugin.config.yaml.YamlElementPatternHelper;
17+
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
18+
import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper;
19+
import org.apache.commons.lang.StringUtils;
20+
import org.jetbrains.annotations.NotNull;
21+
import org.jetbrains.yaml.YAMLFileType;
22+
23+
/**
24+
* @author Daniel Espendiller <daniel@espendiller.net>
25+
*/
26+
public class CaseSensitivityServiceInspection extends LocalInspectionTool {
27+
28+
public static final String SYMFONY_LOWERCASE_LETTERS_FOR_SERVICE = "Symfony: lowercase letters for service";
29+
30+
@NotNull
31+
public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) {
32+
33+
PsiFile psiFile = holder.getFile();
34+
if(psiFile.getFileType() == PhpFileType.INSTANCE) {
35+
phpVisitor(holder);
36+
} else if(psiFile.getFileType() == YAMLFileType.YML) {
37+
yamlVisitor(holder);
38+
} else if(psiFile.getFileType() == XmlFileType.INSTANCE) {
39+
xmlVisitor(holder);
40+
}
41+
42+
return super.buildVisitor(holder, isOnTheFly);
43+
}
44+
45+
private void yamlVisitor(final @NotNull ProblemsHolder holder) {
46+
47+
holder.getFile().acceptChildren(new PsiRecursiveElementVisitor() {
48+
@Override
49+
public void visitElement(PsiElement psiElement) {
50+
51+
// @TODO: support key itself
52+
if (YamlElementPatternHelper.getServiceDefinition().accepts(psiElement) && YamlElementPatternHelper.getInsideServiceKeyPattern().accepts(psiElement)) {
53+
String serviceName = YamlHelper.trimSpecialSyntaxServiceName(psiElement.getText());
54+
// dont mark "@", "@?", "@@" escaping and expressions
55+
if (serviceName.length() > 2 && !serviceName.startsWith("=") && !serviceName.startsWith("@") && !serviceName.equals(serviceName.toLowerCase())) {
56+
holder.registerProblem(psiElement, SYMFONY_LOWERCASE_LETTERS_FOR_SERVICE, ProblemHighlightType.WEAK_WARNING);
57+
}
58+
}
59+
60+
super.visitElement(psiElement);
61+
}
62+
});
63+
}
64+
65+
private void phpVisitor(final @NotNull ProblemsHolder holder) {
66+
67+
holder.getFile().acceptChildren(new PsiRecursiveElementVisitor() {
68+
@Override
69+
public void visitElement(PsiElement element) {
70+
MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter(element);
71+
if (methodReference != null && new Symfony2InterfacesUtil().isContainerGetCall(methodReference)) {
72+
String serviceName = Symfony2InterfacesUtil.getFirstArgumentStringValue(methodReference);
73+
if(serviceName != null && !serviceName.equals(serviceName.toLowerCase())) {
74+
holder.registerProblem(element, SYMFONY_LOWERCASE_LETTERS_FOR_SERVICE, ProblemHighlightType.WEAK_WARNING);
75+
}
76+
}
77+
78+
super.visitElement(element);
79+
}
80+
});
81+
}
82+
83+
private void xmlVisitor(final @NotNull ProblemsHolder holder) {
84+
holder.getFile().acceptChildren(new PsiRecursiveElementVisitor() {
85+
@Override
86+
public void visitElement(PsiElement psiElement) {
87+
if(psiElement instanceof XmlAttributeValue && (XmlHelper.getArgumentServiceIdPattern().accepts(psiElement) || XmlHelper.getServiceIdNamePattern().accepts(psiElement))) {
88+
String serviceName = ((XmlAttributeValue) psiElement).getValue();
89+
if(StringUtils.isNotBlank(serviceName) && !serviceName.equals(serviceName.toLowerCase())) {
90+
holder.registerProblem(psiElement, SYMFONY_LOWERCASE_LETTERS_FOR_SERVICE, ProblemHighlightType.WEAK_WARNING);
91+
}
92+
}
93+
94+
super.visitElement(psiElement);
95+
}
96+
});
97+
}
98+
99+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<html>
2+
<body>
3+
Service Naming Conventions: Use lowercase letters for service and parameter names <a href="http://symfony.com/doc/current/contributing/code/standards.html#service-naming-conventions">more...</a>
4+
<!-- tooltip end -->
5+
</body>
6+
</html>

0 commit comments

Comments
 (0)
0