22
33namespace RectorLaravel \Rector \ArrayDimFetch ;
44
5+ use Override ;
56use PhpParser \Node ;
67use PhpParser \Node \Arg ;
78use PhpParser \Node \Expr ;
1112use PhpParser \Node \Expr \StaticCall ;
1213use PhpParser \Node \Scalar \InterpolatedString ;
1314use PhpParser \Node \Stmt \Unset_ ;
14- use PhpParser \NodeVisitor ;
1515use RectorLaravel \AbstractRector ;
1616use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
1717use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
2121 */
2222class ServerVariableToRequestFacadeRector extends AbstractRector
2323{
24+ private const string IS_IN_SERVER_VARIABLE = 'is_in_server_variable ' ;
25+
2426 public function getRuleDefinition (): RuleDefinition
2527 {
2628 return new RuleDefinition (
@@ -38,27 +40,41 @@ public function getRuleDefinition(): RuleDefinition
3840
3941 public function getNodeTypes (): array
4042 {
41- return [Assign::class, Isset_::class, Unset_::class, InterpolatedString::class, ArrayDimFetch::class];
43+ return [ArrayDimFetch::class];
4244 }
4345
44- /**
45- * @param ArrayDimFetch|Assign|Isset_|Unset_|InterpolatedString $node
46- * @return StaticCall|NodeVisitor::DONT_TRAVERSE_CHILDREN|null
47- */
48- public function refactor (Node $ node ): StaticCall |int |null
46+ #[Override]
47+ public function beforeTraverse (array $ nodes ): array
4948 {
50- if (! $ node instanceof ArrayDimFetch) {
51- if (! $ node instanceof Assign) {
52- return NodeVisitor::DONT_TRAVERSE_CHILDREN ;
53- }
49+ parent ::beforeTraverse ($ nodes );
50+
51+ $ this ->traverseNodesWithCallable ($ nodes , function (Node $ node ) {
52+ if (in_array ($ node ::class, [Assign::class, Isset_::class, Unset_::class, InterpolatedString::class], true )
53+ && (! $ node instanceof Assign || $ node ->var instanceof ArrayDimFetch && $ this ->isName ($ node ->var ->var , '_SERVER ' ))) {
54+ $ this ->traverseNodesWithCallable ($ node , function (Node $ subNode ) {
55+ if (! $ subNode instanceof ArrayDimFetch) {
56+ return null ;
57+ }
5458
55- if (! $ node ->var instanceof ArrayDimFetch || ! $ this ->isName ($ node ->var ->var , '_SERVER ' )) {
56- return null ;
59+ $ subNode ->setAttribute (self ::IS_IN_SERVER_VARIABLE , true );
60+
61+ return $ subNode ;
62+ });
63+
64+ return $ node ;
5765 }
5866
59- return NodeVisitor:: DONT_TRAVERSE_CHILDREN ;
60- }
67+ return null ;
68+ });
6169
70+ return $ nodes ;
71+ }
72+
73+ /**
74+ * @param ArrayDimFetch $node
75+ */
76+ public function refactor (Node $ node ): ?StaticCall
77+ {
6278 if (! $ this ->isName ($ node ->var , '_SERVER ' )) {
6379 return null ;
6480 }
@@ -67,6 +83,10 @@ public function refactor(Node $node): StaticCall|int|null
6783 return null ;
6884 }
6985
86+ if ($ node ->getAttribute (self ::IS_IN_SERVER_VARIABLE ) === true ) {
87+ return null ;
88+ }
89+
7090 return $ this ->nodeFactory ->createStaticCall ('Illuminate\Support\Facades\Request ' , 'server ' , [
7191 new Arg ($ node ->dim ),
7292 ]);
0 commit comments