From 5a33c6f13ae8b7d0b675fb7eef7090697f901b59 Mon Sep 17 00:00:00 2001 From: Bernhard Zwein <52607214+benno5020@users.noreply.github.com> Date: Fri, 29 May 2026 13:18:32 +0200 Subject: [PATCH 1/3] TEST: Add failing for-loop tests --- .../for_loop_with_node_in_condition.php.inc | 32 +++++++++++++++++++ .../Fixture/for-loop.php.inc | 13 ++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_condition.php.inc create mode 100644 tests/Sets/ContentRepository90/Fixture/for-loop.php.inc diff --git a/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_condition.php.inc b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_condition.php.inc new file mode 100644 index 0000000..d6fe236 --- /dev/null +++ b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_condition.php.inc @@ -0,0 +1,32 @@ +getDepth(); $i++) { + echo $i; + } + } +} + +?> +----- +contentRepositoryRegistry->subgraphForNode($node); + for ($i = 0; $i < $subgraph->findNodePath($node->aggregateId)->getDepth(); $i++) { + echo $i; + } + } +} + +?> diff --git a/tests/Sets/ContentRepository90/Fixture/for-loop.php.inc b/tests/Sets/ContentRepository90/Fixture/for-loop.php.inc new file mode 100644 index 0000000..2b96ae6 --- /dev/null +++ b/tests/Sets/ContentRepository90/Fixture/for-loop.php.inc @@ -0,0 +1,13 @@ + From 0dca4ec9badccbf15691bcbf54ad8962e951c655 Mon Sep 17 00:00:00 2001 From: Bernhard Zwein <52607214+benno5020@users.noreply.github.com> Date: Wed, 3 Jun 2026 16:44:21 +0200 Subject: [PATCH 2/3] TEST: Add failing tests for for loop's init and loop expressions --- .../for_loop_with_node_in_init.php.inc | 32 +++++++++++++++++++ .../for_loop_with_node_in_loop.php.inc | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_init.php.inc create mode 100644 tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_loop.php.inc diff --git a/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_init.php.inc b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_init.php.inc new file mode 100644 index 0000000..6ca0ce1 --- /dev/null +++ b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_init.php.inc @@ -0,0 +1,32 @@ +getDepth(); $i > 0; $i--) { + echo $i; + } + } +} + +?> +----- +contentRepositoryRegistry->subgraphForNode($node); + for ($i = $subgraph->findNodePath($node->aggregateId)->getDepth(); $i > 0; $i--) { + echo $i; + } + } +} + +?> diff --git a/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_loop.php.inc b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_loop.php.inc new file mode 100644 index 0000000..ec40c16 --- /dev/null +++ b/tests/ContentRepository90/Rules/NodeGetDepthRector/Fixture/for_loop_with_node_in_loop.php.inc @@ -0,0 +1,32 @@ +getDepth()) { + echo $i; + } + } +} + +?> +----- +contentRepositoryRegistry->subgraphForNode($node); + for ($i = 0; $i < 100; $i = $i + $subgraph->findNodePath($node->aggregateId)->getDepth()) { + echo $i; + } + } +} + +?> From 67f90997e930b092002fb28a56775acd51330f76 Mon Sep 17 00:00:00 2001 From: Bernhard Zwein <52607214+benno5020@users.noreply.github.com> Date: Wed, 3 Jun 2026 17:24:50 +0200 Subject: [PATCH 3/3] BUGFIX: Fix nested arrays error when encountering for loops --- ...binatorGetAllAllowedCombinationsRector.php | 10 +----- .../Rules/ContextGetRootNodeRector.php | 10 +----- .../Rules/NodeFindParentNodeRector.php | 10 +----- .../Rules/NodeGetChildNodesRector.php | 10 +----- .../NodeGetContextGetWorkspaceRector.php | 10 +----- .../Rules/NodeGetDepthRector.php | 10 +----- .../Rules/NodeGetDimensionsRector.php | 10 +----- ...NodeGetHiddenBeforeAfterDateTimeRector.php | 10 +----- .../Rules/NodeGetIdentifierRector.php | 10 +----- .../Rules/NodeGetNodeTypeGetNameRector.php | 10 +----- .../Rules/NodeGetNodeTypeRector.php | 10 +----- .../Rules/NodeGetParentRector.php | 10 +----- .../Rules/NodeGetPathRector.php | 10 +----- .../Rules/NodeSearchServiceRector.php | 10 +----- ...NodeTypeAllowsGrandchildNodeTypeRector.php | 10 +----- ...NodeTypeGetAutoCreatedChildNodesRector.php | 10 +----- ...ypeGetTypeOfAutoCreatedChildNodeRector.php | 12 +------ .../Rules/NodeTypeManagerAccessRector.php | 10 +----- .../Rules/WorkspaceGetBaseWorkspaceRector.php | 10 +----- .../WorkspaceGetBaseWorkspacesRector.php | 10 +----- .../Rules/WorkspaceGetDescriptionRector.php | 10 +----- .../Rules/WorkspaceGetNameRector.php | 10 +----- .../Rules/WorkspaceGetTitleRector.php | 10 +----- .../Rules/WorkspacePublishNodeRector.php | 10 +----- .../Rules/WorkspacePublishRector.php | 10 +----- .../WorkspaceRepositoryCountByNameRector.php | 10 +----- ...aceRepositoryFindByBaseWorkspaceRector.php | 10 +----- ...kspaceRepositoryFindByIdentifierRector.php | 10 +----- .../Rules/WorkspaceSetDescriptionRector.php | 10 +----- .../Rules/WorkspaceSetTitleRector.php | 10 +----- ...ectInstantiationToWarningCommentRector.php | 10 +----- src/Generic/Rules/Traits/FunctionsTrait.php | 33 +++++++++++++++++++ 32 files changed, 64 insertions(+), 281 deletions(-) diff --git a/src/ContentRepository90/Rules/ContentDimensionCombinatorGetAllAllowedCombinationsRector.php b/src/ContentRepository90/Rules/ContentDimensionCombinatorGetAllAllowedCombinationsRector.php index 568cd17..b43b759 100644 --- a/src/ContentRepository90/Rules/ContentDimensionCombinatorGetAllAllowedCombinationsRector.php +++ b/src/ContentRepository90/Rules/ContentDimensionCombinatorGetAllAllowedCombinationsRector.php @@ -75,15 +75,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/ContextGetRootNodeRector.php b/src/ContentRepository90/Rules/ContextGetRootNodeRector.php index 7e42696..d4bd1d1 100644 --- a/src/ContentRepository90/Rules/ContextGetRootNodeRector.php +++ b/src/ContentRepository90/Rules/ContextGetRootNodeRector.php @@ -80,15 +80,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeFindParentNodeRector.php b/src/ContentRepository90/Rules/NodeFindParentNodeRector.php index a35de11..8a72abe 100644 --- a/src/ContentRepository90/Rules/NodeFindParentNodeRector.php +++ b/src/ContentRepository90/Rules/NodeFindParentNodeRector.php @@ -74,15 +74,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetChildNodesRector.php b/src/ContentRepository90/Rules/NodeGetChildNodesRector.php index a547947..8e8a2df 100644 --- a/src/ContentRepository90/Rules/NodeGetChildNodesRector.php +++ b/src/ContentRepository90/Rules/NodeGetChildNodesRector.php @@ -100,15 +100,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetContextGetWorkspaceRector.php b/src/ContentRepository90/Rules/NodeGetContextGetWorkspaceRector.php index ff4fd2b..30221d0 100644 --- a/src/ContentRepository90/Rules/NodeGetContextGetWorkspaceRector.php +++ b/src/ContentRepository90/Rules/NodeGetContextGetWorkspaceRector.php @@ -80,15 +80,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetDepthRector.php b/src/ContentRepository90/Rules/NodeGetDepthRector.php index 457f331..dcfaece 100644 --- a/src/ContentRepository90/Rules/NodeGetDepthRector.php +++ b/src/ContentRepository90/Rules/NodeGetDepthRector.php @@ -74,15 +74,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetDimensionsRector.php b/src/ContentRepository90/Rules/NodeGetDimensionsRector.php index 57d9cae..1d156a4 100644 --- a/src/ContentRepository90/Rules/NodeGetDimensionsRector.php +++ b/src/ContentRepository90/Rules/NodeGetDimensionsRector.php @@ -74,15 +74,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetHiddenBeforeAfterDateTimeRector.php b/src/ContentRepository90/Rules/NodeGetHiddenBeforeAfterDateTimeRector.php index b99da2f..272db63 100644 --- a/src/ContentRepository90/Rules/NodeGetHiddenBeforeAfterDateTimeRector.php +++ b/src/ContentRepository90/Rules/NodeGetHiddenBeforeAfterDateTimeRector.php @@ -85,15 +85,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetIdentifierRector.php b/src/ContentRepository90/Rules/NodeGetIdentifierRector.php index cf8f927..c5b543b 100644 --- a/src/ContentRepository90/Rules/NodeGetIdentifierRector.php +++ b/src/ContentRepository90/Rules/NodeGetIdentifierRector.php @@ -75,15 +75,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetNodeTypeGetNameRector.php b/src/ContentRepository90/Rules/NodeGetNodeTypeGetNameRector.php index c300a35..02f335e 100644 --- a/src/ContentRepository90/Rules/NodeGetNodeTypeGetNameRector.php +++ b/src/ContentRepository90/Rules/NodeGetNodeTypeGetNameRector.php @@ -83,15 +83,7 @@ public function leaveNode(Node $node) } ); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetNodeTypeRector.php b/src/ContentRepository90/Rules/NodeGetNodeTypeRector.php index 560da92..3c5e26d 100644 --- a/src/ContentRepository90/Rules/NodeGetNodeTypeRector.php +++ b/src/ContentRepository90/Rules/NodeGetNodeTypeRector.php @@ -79,15 +79,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetParentRector.php b/src/ContentRepository90/Rules/NodeGetParentRector.php index 9685372..cd9d6d0 100644 --- a/src/ContentRepository90/Rules/NodeGetParentRector.php +++ b/src/ContentRepository90/Rules/NodeGetParentRector.php @@ -75,15 +75,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeGetPathRector.php b/src/ContentRepository90/Rules/NodeGetPathRector.php index e894ba0..f2daf14 100644 --- a/src/ContentRepository90/Rules/NodeGetPathRector.php +++ b/src/ContentRepository90/Rules/NodeGetPathRector.php @@ -80,15 +80,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeSearchServiceRector.php b/src/ContentRepository90/Rules/NodeSearchServiceRector.php index b2e766d..1e85966 100644 --- a/src/ContentRepository90/Rules/NodeSearchServiceRector.php +++ b/src/ContentRepository90/Rules/NodeSearchServiceRector.php @@ -117,15 +117,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeTypeAllowsGrandchildNodeTypeRector.php b/src/ContentRepository90/Rules/NodeTypeAllowsGrandchildNodeTypeRector.php index 1035062..39c21e3 100644 --- a/src/ContentRepository90/Rules/NodeTypeAllowsGrandchildNodeTypeRector.php +++ b/src/ContentRepository90/Rules/NodeTypeAllowsGrandchildNodeTypeRector.php @@ -95,15 +95,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeTypeGetAutoCreatedChildNodesRector.php b/src/ContentRepository90/Rules/NodeTypeGetAutoCreatedChildNodesRector.php index 9db6d9b..87fc574 100644 --- a/src/ContentRepository90/Rules/NodeTypeGetAutoCreatedChildNodesRector.php +++ b/src/ContentRepository90/Rules/NodeTypeGetAutoCreatedChildNodesRector.php @@ -77,15 +77,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/NodeTypeGetTypeOfAutoCreatedChildNodeRector.php b/src/ContentRepository90/Rules/NodeTypeGetTypeOfAutoCreatedChildNodeRector.php index 9a56b90..a873934 100644 --- a/src/ContentRepository90/Rules/NodeTypeGetTypeOfAutoCreatedChildNodeRector.php +++ b/src/ContentRepository90/Rules/NodeTypeGetTypeOfAutoCreatedChildNodeRector.php @@ -86,15 +86,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } @@ -102,8 +94,6 @@ public function leaveNode(Node $node) return null; } - $node->expr = $newExpr; - return [ new Nop(), // Needed, to render the comment below self::withTodoComment( diff --git a/src/ContentRepository90/Rules/NodeTypeManagerAccessRector.php b/src/ContentRepository90/Rules/NodeTypeManagerAccessRector.php index d899757..d2e63df 100644 --- a/src/ContentRepository90/Rules/NodeTypeManagerAccessRector.php +++ b/src/ContentRepository90/Rules/NodeTypeManagerAccessRector.php @@ -71,15 +71,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspaceRector.php b/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspaceRector.php index 14221da..e50dc3d 100644 --- a/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspaceRector.php +++ b/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspaceRector.php @@ -80,15 +80,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspacesRector.php b/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspacesRector.php index 4a5f03d..d3d6b65 100644 --- a/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspacesRector.php +++ b/src/ContentRepository90/Rules/WorkspaceGetBaseWorkspacesRector.php @@ -84,15 +84,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceGetDescriptionRector.php b/src/ContentRepository90/Rules/WorkspaceGetDescriptionRector.php index d4cf3ba..4c27654 100644 --- a/src/ContentRepository90/Rules/WorkspaceGetDescriptionRector.php +++ b/src/ContentRepository90/Rules/WorkspaceGetDescriptionRector.php @@ -82,15 +82,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceGetNameRector.php b/src/ContentRepository90/Rules/WorkspaceGetNameRector.php index a2a86aa..e931663 100644 --- a/src/ContentRepository90/Rules/WorkspaceGetNameRector.php +++ b/src/ContentRepository90/Rules/WorkspaceGetNameRector.php @@ -75,15 +75,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceGetTitleRector.php b/src/ContentRepository90/Rules/WorkspaceGetTitleRector.php index b820e9e..354b684 100644 --- a/src/ContentRepository90/Rules/WorkspaceGetTitleRector.php +++ b/src/ContentRepository90/Rules/WorkspaceGetTitleRector.php @@ -82,15 +82,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspacePublishNodeRector.php b/src/ContentRepository90/Rules/WorkspacePublishNodeRector.php index 1d3ceb1..0a0730f 100644 --- a/src/ContentRepository90/Rules/WorkspacePublishNodeRector.php +++ b/src/ContentRepository90/Rules/WorkspacePublishNodeRector.php @@ -82,15 +82,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspacePublishRector.php b/src/ContentRepository90/Rules/WorkspacePublishRector.php index 34ce9de..bad0e2b 100644 --- a/src/ContentRepository90/Rules/WorkspacePublishRector.php +++ b/src/ContentRepository90/Rules/WorkspacePublishRector.php @@ -81,15 +81,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceRepositoryCountByNameRector.php b/src/ContentRepository90/Rules/WorkspaceRepositoryCountByNameRector.php index fb52850..d44abf3 100644 --- a/src/ContentRepository90/Rules/WorkspaceRepositoryCountByNameRector.php +++ b/src/ContentRepository90/Rules/WorkspaceRepositoryCountByNameRector.php @@ -82,15 +82,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceRepositoryFindByBaseWorkspaceRector.php b/src/ContentRepository90/Rules/WorkspaceRepositoryFindByBaseWorkspaceRector.php index 3da1f44..5165c49 100644 --- a/src/ContentRepository90/Rules/WorkspaceRepositoryFindByBaseWorkspaceRector.php +++ b/src/ContentRepository90/Rules/WorkspaceRepositoryFindByBaseWorkspaceRector.php @@ -86,15 +86,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceRepositoryFindByIdentifierRector.php b/src/ContentRepository90/Rules/WorkspaceRepositoryFindByIdentifierRector.php index db5ca7a..b167987 100644 --- a/src/ContentRepository90/Rules/WorkspaceRepositoryFindByIdentifierRector.php +++ b/src/ContentRepository90/Rules/WorkspaceRepositoryFindByIdentifierRector.php @@ -77,15 +77,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceSetDescriptionRector.php b/src/ContentRepository90/Rules/WorkspaceSetDescriptionRector.php index efd2153..d67d186 100644 --- a/src/ContentRepository90/Rules/WorkspaceSetDescriptionRector.php +++ b/src/ContentRepository90/Rules/WorkspaceSetDescriptionRector.php @@ -77,15 +77,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/ContentRepository90/Rules/WorkspaceSetTitleRector.php b/src/ContentRepository90/Rules/WorkspaceSetTitleRector.php index 19ce939..1e9e67f 100644 --- a/src/ContentRepository90/Rules/WorkspaceSetTitleRector.php +++ b/src/ContentRepository90/Rules/WorkspaceSetTitleRector.php @@ -74,15 +74,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/Generic/Rules/ObjectInstantiationToWarningCommentRector.php b/src/Generic/Rules/ObjectInstantiationToWarningCommentRector.php index 40e402e..5eec5e5 100644 --- a/src/Generic/Rules/ObjectInstantiationToWarningCommentRector.php +++ b/src/Generic/Rules/ObjectInstantiationToWarningCommentRector.php @@ -82,15 +82,7 @@ public function leaveNode(Node $node) } }); - if (in_array('expr', $node->getSubNodeNames())) { - /** @var Node\Expr $newExpr */ - $newExpr = $traverser->traverse([$node->expr])[0]; - $node->expr = $newExpr; - } elseif (in_array('cond', $node->getSubNodeNames())) { - /** @var Node\Expr $newCond */ - $newCond = $traverser->traverse([$node->cond])[0]; - $node->cond = $newCond; - } else { + if (!self::traverseStatementExpressions($traverser, $node)) { return null; } diff --git a/src/Generic/Rules/Traits/FunctionsTrait.php b/src/Generic/Rules/Traits/FunctionsTrait.php index 522b068..6c9a916 100644 --- a/src/Generic/Rules/Traits/FunctionsTrait.php +++ b/src/Generic/Rules/Traits/FunctionsTrait.php @@ -7,7 +7,9 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Expression; +use PhpParser\NodeTraverser; use Rector\PhpParser\Node\NodeFactory; trait FunctionsTrait @@ -24,6 +26,37 @@ private function castToString(Expr $inner): Expr return new Expr\Cast\String_($inner); } + /** + * Run the given traverser on the expression sub-nodes of a statement, assigning the + * transformed expressions back in place. This handles both single-expression sub-nodes + * (e.g. Expression::$expr, If_::$cond) and arrays of expressions + * (e.g. For_::$init / $cond / $loop, which are Expr[]). + * + * @see \PhpParser\Node\Stmt\Expression + * @see \PhpParser\Node\Stmt\If_ + * @see \PhpParser\Node\Stmt\For_ + * + * @return bool whether the statement had any expression sub-node to traverse + */ + private static function traverseStatementExpressions(NodeTraverser $traverser, Stmt $node): bool + { + $traversed = false; + + foreach (['expr', 'init', 'cond', 'loop'] as $subNodeName) { + if (!in_array($subNodeName, $node->getSubNodeNames(), true) || $node->{$subNodeName} === null) { + continue; + } + + $traversed = true; + $value = $node->{$subNodeName}; + $node->{$subNodeName} = is_array($value) + ? $traverser->traverse($value) + : $traverser->traverse([$value])[0]; + } + + return $traversed; + } + private static function assign(string $variableName, Expr $value): Expression { // NOTE: it is crucial to wrap thw assign in an expression; so that this works with self::withTodoComment.