33import com .intellij .codeInspection .LocalInspectionTool ;
44import com .intellij .codeInspection .ProblemHighlightType ;
55import 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 ;
79import com .intellij .psi .PsiElement ;
810import 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 ;
1212import com .jetbrains .php .lang .documentation .phpdoc .psi .PhpDocComment ;
13- import com .jetbrains .php .lang .psi .PhpFile ;
1413import com .jetbrains .php .lang .psi .elements .MethodReference ;
1514import com .jetbrains .php .lang .psi .elements .PhpClass ;
1615import com .jetbrains .php .lang .psi .elements .StringLiteralExpression ;
2625import fr .adrienbrault .idea .symfony2plugin .util .dict .ServiceUtil ;
2726import org .apache .commons .lang .StringUtils ;
2827import org .jetbrains .annotations .NotNull ;
28+ import org .jetbrains .yaml .YAMLLanguage ;
2929import org .jetbrains .yaml .YAMLTokenTypes ;
30- import org .jetbrains .yaml .psi .YAMLFile ;
3130
3231import 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