1212use PhpParser \Node \Stmt ;
1313use PhpParser \NodeVisitorAbstract ;
1414use PhpStaticAnalysis \Attributes \Deprecated ;
15+ use PhpStaticAnalysis \Attributes \Impure ;
1516use PhpStaticAnalysis \Attributes \Internal ;
1617use PhpStaticAnalysis \Attributes \IsReadOnly ;
1718use PhpStaticAnalysis \Attributes \Method ;
2122use PhpStaticAnalysis \Attributes \Property ;
2223use PhpStaticAnalysis \Attributes \PropertyRead ;
2324use PhpStaticAnalysis \Attributes \PropertyWrite ;
25+ use PhpStaticAnalysis \Attributes \Pure ;
2426use PhpStaticAnalysis \Attributes \RequireExtends ;
2527use PhpStaticAnalysis \Attributes \RequireImplements ;
2628use PhpStaticAnalysis \Attributes \Returns ;
3638class AttributeNodeVisitor extends NodeVisitorAbstract
3739{
3840 private const ARGS_NONE = 'none ' ;
41+ private const ARGS_NONE_WITH_PREFIX = 'none with prefix ' ;
3942 private const ARGS_ONE = 'one ' ;
4043 private const ARGS_ONE_OPTIONAL = 'one optional ' ;
4144 private const ARGS_ONE_WITH_PREFIX = 'one with prefix ' ;
@@ -78,19 +81,23 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
7881 ],
7982 Stmt \ClassMethod::class => [
8083 Deprecated::class,
84+ Impure::class,
8185 Internal::class,
8286 Param::class,
8387 ParamOut::class,
88+ Pure::class,
8489 Returns::class,
8590 SelfOut::class,
8691 Template::class,
8792 Type::class,
8893 ],
8994 Stmt \Function_::class => [
9095 Deprecated::class,
96+ Impure::class,
9197 Internal::class,
9298 Param::class,
9399 ParamOut::class,
100+ Pure::class,
94101 Returns::class,
95102 Template::class,
96103 Type::class,
@@ -132,6 +139,7 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
132139
133140 private const SHORT_NAME_TO_FQN = [
134141 'Deprecated ' => Deprecated::class,
142+ 'Impure ' => Impure::class,
135143 'Internal ' => Internal::class,
136144 'IsReadOnly ' => IsReadOnly::class,
137145 'Method ' => Method::class,
@@ -141,6 +149,7 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
141149 'Property ' => Property::class,
142150 'PropertyRead ' => PropertyRead::class,
143151 'PropertyWrite ' => PropertyWrite::class,
152+ 'Pure ' => Pure::class,
144153 'RequireExtends ' => RequireExtends::class,
145154 'RequireImplements ' => RequireImplements::class,
146155 'Returns ' => Returns::class,
@@ -158,6 +167,9 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
158167 Deprecated::class => [
159168 'all ' => 'deprecated ' ,
160169 ],
170+ Impure::class => [
171+ 'all ' => 'impure ' ,
172+ ],
161173 Internal::class => [
162174 'all ' => 'internal ' ,
163175 ],
@@ -186,6 +198,9 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
186198 PropertyWrite::class => [
187199 'all ' => 'property-write ' ,
188200 ],
201+ Pure::class => [
202+ 'all ' => 'pure ' ,
203+ ],
189204 RequireExtends::class => [
190205 'all ' => 'require-extends ' ,
191206 ],
@@ -228,6 +243,9 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
228243 Deprecated::class => [
229244 'all ' => self ::ARGS_NONE ,
230245 ],
246+ Impure::class => [
247+ 'all ' => self ::ARGS_NONE_WITH_PREFIX ,
248+ ],
231249 Internal::class => [
232250 'all ' => self ::ARGS_ONE_OPTIONAL ,
233251 ],
@@ -256,6 +274,9 @@ class AttributeNodeVisitor extends NodeVisitorAbstract
256274 PropertyWrite::class => [
257275 'all ' => self ::ARGS_MANY_WITH_NAME ,
258276 ],
277+ Pure::class => [
278+ 'all ' => self ::ARGS_NONE_WITH_PREFIX ,
279+ ],
259280 RequireExtends::class => [
260281 'all ' => self ::ARGS_ONE_WITH_PREFIX ,
261282 ],
@@ -341,6 +362,10 @@ public function enterNode(Node $node)
341362 $ tagsToAdd [] = $ this ->createTag ($ nodeType , $ attributeName );
342363 $ tagCreated = true ;
343364 break ;
365+ case self ::ARGS_NONE_WITH_PREFIX :
366+ $ tagsToAdd [] = $ this ->createTag ($ nodeType , $ attributeName , prefix: $ this ->toolType );
367+ $ tagCreated = true ;
368+ break ;
344369 case self ::ARGS_ONE :
345370 if (isset ($ args [0 ])) {
346371 $ tagsToAdd [] = $ this ->createTag ($ nodeType , $ attributeName , $ args [0 ]);
0 commit comments