Skip to content

Commit fcd4d20

Browse files
committed
replace recursive visiting for service deprecation inspection
1 parent 522a962 commit fcd4d20

File tree

1 file changed

+69
-125
lines changed

1 file changed

+69
-125
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/codeInspection/service/ServiceDeprecatedClassesInspection.java

Lines changed: 69 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import com.intellij.codeInspection.LocalInspectionTool;
44
import com.intellij.codeInspection.ProblemHighlightType;
55
import com.intellij.codeInspection.ProblemsHolder;
6-
import com.intellij.openapi.project.Project;
6+
import com.intellij.lang.Language;
7+
import com.intellij.lang.xml.XMLLanguage;
8+
import com.intellij.openapi.util.NotNullLazyValue;
79
import com.intellij.psi.PsiElement;
810
import com.intellij.psi.PsiElementVisitor;
9-
import com.intellij.psi.PsiFile;
10-
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
11-
import com.intellij.psi.xml.XmlFile;
11+
import com.jetbrains.php.lang.PhpLanguage;
1212
import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment;
13-
import com.jetbrains.php.lang.psi.PhpFile;
1413
import com.jetbrains.php.lang.psi.elements.MethodReference;
1514
import com.jetbrains.php.lang.psi.elements.PhpClass;
1615
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
@@ -26,8 +25,8 @@
2625
import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil;
2726
import org.apache.commons.lang.StringUtils;
2827
import org.jetbrains.annotations.NotNull;
28+
import org.jetbrains.yaml.YAMLLanguage;
2929
import org.jetbrains.yaml.YAMLTokenTypes;
30-
import org.jetbrains.yaml.psi.YAMLFile;
3130

3231
import java.util.Map;
3332

@@ -49,9 +48,8 @@ private static class ProblemRegistrar {
4948

5049
private ContainerCollectionResolver.LazyServiceCollector lazyServiceCollector;
5150

52-
public void attachDeprecatedProblem(PsiElement element, String text, ProblemsHolder holder) {
53-
54-
PhpClass phpClass = ServiceUtil.getResolvedClassDefinition(element.getProject(), text, getLazyServiceCollector(element.getProject()));
51+
public static void attachDeprecatedProblem(@NotNull PsiElement element, @NotNull String text, @NotNull ProblemsHolder holder, @NotNull NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> lazyServiceCollector) {
52+
PhpClass phpClass = ServiceUtil.getResolvedClassDefinition(element.getProject(), text, lazyServiceCollector.get());
5553
if(phpClass == null) {
5654
return;
5755
}
@@ -63,9 +61,8 @@ public void attachDeprecatedProblem(PsiElement element, String text, ProblemsHol
6361

6462
}
6563

66-
public void attachServiceDeprecatedProblem(@NotNull PsiElement element, @NotNull String serviceName, @NotNull ProblemsHolder holder) {
67-
68-
Map<String, ContainerService> services = getLazyServiceCollector(element.getProject()).getCollector().getServices();
64+
public static void attachServiceDeprecatedProblem(@NotNull PsiElement element, @NotNull String serviceName, @NotNull ProblemsHolder holder, @NotNull NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> lazyServiceCollector) {
65+
Map<String, ContainerService> services = lazyServiceCollector.get().getCollector().getServices();
6966
if(!services.containsKey(serviceName)) {
7067
return;
7168
}
@@ -77,153 +74,100 @@ public void attachServiceDeprecatedProblem(@NotNull PsiElement element, @NotNull
7774

7875
holder.registerProblem(element, String.format("Service '%s' is deprecated", serviceName), ProblemHighlightType.LIKE_DEPRECATED);
7976
}
80-
81-
private ContainerCollectionResolver.LazyServiceCollector getLazyServiceCollector(Project project) {
82-
return this.lazyServiceCollector == null ? this.lazyServiceCollector = new ContainerCollectionResolver.LazyServiceCollector(project) : this.lazyServiceCollector;
83-
}
84-
85-
public void reset() {
86-
this.lazyServiceCollector = null;
87-
}
8877
}
8978

79+
private void visitXmlElement(@NotNull PsiElement element, @NotNull ProblemsHolder holder, @NotNull NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> lazyServiceCollector) {
80+
boolean serviceArgumentAccepted = XmlHelper.getArgumentServiceIdPattern().accepts(element);
9081

91-
private class XmlClassElementWalkingVisitor extends PsiRecursiveElementWalkingVisitor {
92-
private final ProblemsHolder holder;
93-
private final ProblemRegistrar problemRegistrar;
82+
if(serviceArgumentAccepted || XmlHelper.getServiceClassAttributeWithIdPattern().accepts(element)) {
83+
String text = PsiElementUtils.trimQuote(element.getText());
84+
PsiElement[] psiElements = element.getChildren();
9485

95-
public XmlClassElementWalkingVisitor(ProblemsHolder holder, ProblemRegistrar problemRegistrar) {
96-
this.holder = holder;
97-
this.problemRegistrar = problemRegistrar;
98-
}
86+
// we need to attach to child because else strike out equal and quote char
87+
if(StringUtils.isNotBlank(text) && psiElements.length > 2) {
88+
ProblemRegistrar.attachDeprecatedProblem(psiElements[1], text, holder, lazyServiceCollector);
9989

100-
@Override
101-
public void visitElement(@NotNull PsiElement element) {
102-
boolean serviceArgumentAccepted = XmlHelper.getArgumentServiceIdPattern().accepts(element);
103-
if(serviceArgumentAccepted || XmlHelper.getServiceClassAttributeWithIdPattern().accepts(element)) {
104-
String text = PsiElementUtils.trimQuote(element.getText());
105-
PsiElement[] psiElements = element.getChildren();
106-
107-
// we need to attach to child because else strike out equal and quote char
108-
if(StringUtils.isNotBlank(text) && psiElements.length > 2) {
109-
this.problemRegistrar.attachDeprecatedProblem(psiElements[1], text, holder);
110-
111-
// check service arguments for "deprecated" defs
112-
if(serviceArgumentAccepted) {
113-
this.problemRegistrar.attachServiceDeprecatedProblem(psiElements[1], text, holder);
114-
}
90+
// check service arguments for "deprecated" defs
91+
if(serviceArgumentAccepted) {
92+
ProblemRegistrar.attachServiceDeprecatedProblem(psiElements[1], text, holder, lazyServiceCollector);
11593
}
11694
}
117-
118-
super.visitElement(element);
11995
}
12096
}
12197

122-
private class YmlClassElementWalkingVisitor extends PsiRecursiveElementWalkingVisitor {
123-
private final ProblemsHolder holder;
124-
private final ProblemRegistrar problemRegistrar;
125-
126-
public YmlClassElementWalkingVisitor(ProblemsHolder holder, ProblemRegistrar problemRegistrar) {
127-
this.holder = holder;
128-
this.problemRegistrar = problemRegistrar;
129-
}
130-
131-
@Override
132-
public void visitElement(PsiElement element) {
98+
private void visitYamlElement(@NotNull PsiElement element, @NotNull ProblemsHolder holder, NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> lazyServiceCollector) {
13399

134-
if(YamlElementPatternHelper.getSingleLineScalarKey("class").accepts(element)) {
135-
// class: '\Foo'
136-
String text = PsiElementUtils.trimQuote(element.getText());
137-
if(StringUtils.isNotBlank(text)) {
138-
this.problemRegistrar.attachDeprecatedProblem(element, text, holder);
139-
}
140-
} else if(element.getNode().getElementType() == YAMLTokenTypes.TEXT) {
141-
// @service
142-
String text = element.getText();
143-
if(StringUtils.isNotBlank(text) && text.startsWith("@")) {
144-
this.problemRegistrar.attachDeprecatedProblem(element, text.substring(1), holder);
145-
this.problemRegistrar.attachServiceDeprecatedProblem(element, text.substring(1), holder);
146-
}
100+
if(YamlElementPatternHelper.getSingleLineScalarKey("class").accepts(element)) {
101+
// class: '\Foo'
102+
String text = PsiElementUtils.trimQuote(element.getText());
103+
if(StringUtils.isNotBlank(text)) {
104+
ProblemRegistrar.attachDeprecatedProblem(element, text, holder, lazyServiceCollector);
105+
}
106+
} else if(element.getNode().getElementType() == YAMLTokenTypes.TEXT) {
107+
// @service
108+
String text = element.getText();
109+
if(StringUtils.isNotBlank(text) && text.startsWith("@")) {
110+
ProblemRegistrar.attachDeprecatedProblem(element, text.substring(1), holder, lazyServiceCollector);
111+
ProblemRegistrar.attachServiceDeprecatedProblem(element, text.substring(1), holder, lazyServiceCollector);
147112
}
148-
149-
super.visitElement(element);
150113
}
151114
}
152115

153-
private class PhpClassWalkingVisitor extends PsiRecursiveElementWalkingVisitor {
154-
@NotNull
155-
private final ProblemsHolder holder;
156-
157-
@NotNull
158-
private final ProblemRegistrar problemRegistrar;
116+
private void visitPhpElement(@NotNull StringLiteralExpression psiElement, @NotNull ProblemsHolder holder, NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> lazyServiceCollector) {
117+
// #[Autowire(service: 'foobar')]
118+
PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression(psiElement);
159119

160-
private PhpClassWalkingVisitor(@NotNull ProblemsHolder holder, @NotNull ProblemRegistrar problemRegistrar) {
161-
this.holder = holder;
162-
this.problemRegistrar = problemRegistrar;
163-
}
164-
165-
@Override
166-
public void visitElement(PsiElement psiElement) {
167-
if (!(psiElement instanceof StringLiteralExpression)) {
168-
super.visitElement(psiElement);
169-
return;
170-
}
171-
172-
// #[Autowire(service: 'foobar')]
173-
PsiElement leafText = PsiElementUtils.getTextLeafElementFromStringLiteralExpression((StringLiteralExpression) psiElement);
174-
175-
if (leafText != null && PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText)) {
176-
String contents = ((StringLiteralExpression) psiElement).getContents();
177-
if(StringUtils.isNotBlank(contents)) {
178-
this.problemRegistrar.attachDeprecatedProblem(psiElement, contents, holder);
179-
this.problemRegistrar.attachServiceDeprecatedProblem(psiElement, contents, holder);
180-
}
181-
182-
super.visitElement(psiElement);
183-
return;
120+
if (leafText != null && PhpElementsUtil.getAttributeNamedArgumentStringPattern(ServiceContainerUtil.AUTOWIRE_ATTRIBUTE_CLASS, "service").accepts(leafText)) {
121+
String contents = psiElement.getContents();
122+
if(StringUtils.isNotBlank(contents)) {
123+
ProblemRegistrar.attachDeprecatedProblem(psiElement, contents, holder, lazyServiceCollector);
124+
ProblemRegistrar.attachServiceDeprecatedProblem(psiElement, contents, holder, lazyServiceCollector);
184125
}
185126

186-
MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter((StringLiteralExpression) psiElement);
187-
if (methodReference == null || !PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, ServiceContainerUtil.SERVICE_GET_SIGNATURES)) {
188-
super.visitElement(psiElement);
189-
return;
190-
}
127+
return;
128+
}
191129

192-
String contents = ((StringLiteralExpression) psiElement).getContents();
193-
if(StringUtils.isNotBlank(contents)) {
194-
this.problemRegistrar.attachDeprecatedProblem(psiElement, contents, holder);
195-
this.problemRegistrar.attachServiceDeprecatedProblem(psiElement, contents, holder);
196-
}
130+
MethodReference methodReference = PsiElementUtils.getMethodReferenceWithFirstStringParameter(psiElement);
131+
if (methodReference == null || !PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, ServiceContainerUtil.SERVICE_GET_SIGNATURES)) {
132+
return;
133+
}
197134

198-
super.visitElement(psiElement);
135+
String contents = psiElement.getContents();
136+
if(StringUtils.isNotBlank(contents)) {
137+
ProblemRegistrar.attachDeprecatedProblem(psiElement, contents, holder, lazyServiceCollector);
138+
ProblemRegistrar.attachServiceDeprecatedProblem(psiElement, contents, holder, lazyServiceCollector);
199139
}
200140
}
201141

202142
private class MyPsiElementVisitor extends PsiElementVisitor {
203143
private final ProblemsHolder holder;
144+
private NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> serviceCollector;
204145

205-
public MyPsiElementVisitor(ProblemsHolder holder) {
146+
public MyPsiElementVisitor(@NotNull ProblemsHolder holder) {
206147
this.holder = holder;
207148
}
208149

209150
@Override
210-
public void visitFile(PsiFile psiFile) {
211-
212-
ProblemRegistrar problemRegistrar = null;
213-
214-
if(psiFile instanceof YAMLFile) {
215-
psiFile.acceptChildren(new YmlClassElementWalkingVisitor(holder, problemRegistrar = new ProblemRegistrar()));
216-
} else if(psiFile instanceof XmlFile) {
217-
psiFile.acceptChildren(new XmlClassElementWalkingVisitor(holder, problemRegistrar = new ProblemRegistrar()));
218-
} else if(psiFile instanceof PhpFile) {
219-
psiFile.acceptChildren(new PhpClassWalkingVisitor(holder, problemRegistrar = new ProblemRegistrar()));
151+
public void visitElement(@NotNull PsiElement element) {
152+
Language language = element.getLanguage();
153+
154+
if (language == XMLLanguage.INSTANCE) {
155+
visitXmlElement(element, holder, createLazyServiceCollector());
156+
} else if (language == YAMLLanguage.INSTANCE) {
157+
visitYamlElement(element, holder, createLazyServiceCollector());
158+
} else if (language == PhpLanguage.INSTANCE) {
159+
if (element instanceof StringLiteralExpression stringLiteralExpression) {
160+
visitPhpElement(stringLiteralExpression, holder, createLazyServiceCollector());
161+
}
220162
}
163+
}
221164

222-
if(problemRegistrar != null) {
223-
problemRegistrar.reset();
165+
private NotNullLazyValue<ContainerCollectionResolver.LazyServiceCollector> createLazyServiceCollector() {
166+
if (this.serviceCollector == null) {
167+
this.serviceCollector = NotNullLazyValue.lazy(() -> new ContainerCollectionResolver.LazyServiceCollector(holder.getProject()));
224168
}
225169

226-
super.visitFile(psiFile);
170+
return this.serviceCollector;
227171
}
228172
}
229173
}

0 commit comments

Comments
 (0)