diff --git a/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAllRector/Fixture/skip_modify_outer_variable.php.inc b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAllRector/Fixture/skip_modify_outer_variable.php.inc new file mode 100644 index 00000000000..157d7294a1a --- /dev/null +++ b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAllRector/Fixture/skip_modify_outer_variable.php.inc @@ -0,0 +1,46 @@ + $limit) { + $valid = false; + break; + } + } + + return $valid; + } + + public function earlyReturn(array $items, array $others): bool + { + $i = 0; + foreach ($items as $item) { + if ($item !== $others[$i++]) { + return false; + } + } + + return true; + } +} diff --git a/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_modify_outer_variable.php.inc b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_modify_outer_variable.php.inc new file mode 100644 index 00000000000..f89b580d8e9 --- /dev/null +++ b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_modify_outer_variable.php.inc @@ -0,0 +1,32 @@ + $item) { + if ($item === $others[$i++]) { + $found = $idx; + break; + } + } + + return $found; + } +} diff --git a/rules-tests/Php84/Rector/Foreach_/ForeachToArrayFindRector/Fixture/skip_modify_outer_variable.php.inc b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayFindRector/Fixture/skip_modify_outer_variable.php.inc new file mode 100644 index 00000000000..c9d832c9485 --- /dev/null +++ b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayFindRector/Fixture/skip_modify_outer_variable.php.inc @@ -0,0 +1,20 @@ +betterNodeFinder->hasInstancesOf($expr, [ + Assign::class, + AssignOp::class, + AssignRef::class, + PreInc::class, + PreDec::class, + PostInc::class, + PostDec::class, + ]); + } +} diff --git a/rules/Php84/NodeFactory/ForeachToArrayAnyAllFactory.php b/rules/Php84/NodeFactory/ForeachToArrayAnyAllFactory.php index bc5c2206beb..33f1e1fdb3a 100644 --- a/rules/Php84/NodeFactory/ForeachToArrayAnyAllFactory.php +++ b/rules/Php84/NodeFactory/ForeachToArrayAnyAllFactory.php @@ -20,6 +20,7 @@ use Rector\NodeManipulator\StmtsManipulator; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\Php84\NodeAnalyzer\ExprModifiedInConditionalAnalyzer; use Rector\Php84\NodeAnalyzer\ForeachKeyUsedInConditionalAnalyzer; use Rector\PhpParser\Comparing\NodeComparator; use Rector\PhpParser\Node\NodeFactory; @@ -37,7 +38,8 @@ public function __construct( private NodeComparator $nodeComparator, private NodeTypeResolver $nodeTypeResolver, private NodeFactory $nodeFactory, - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private ExprModifiedInConditionalAnalyzer $exprModifiedInConditionalAnalyzer ) { } @@ -238,6 +240,10 @@ private function isValidBooleanAssignmentForeachStructure( return false; } + if ($this->exprModifiedInConditionalAnalyzer->isModified($firstStmt->cond)) { + return false; + } + if ($rejectElseBranches && ($firstStmt->elseifs !== [] || $firstStmt->else instanceof Else_)) { return false; } @@ -283,6 +289,10 @@ private function isValidEarlyReturnForeachStructure( $ifStmt = $foreach->stmts[0]; + if ($this->exprModifiedInConditionalAnalyzer->isModified($ifStmt->cond)) { + return false; + } + if ($rejectElseBranches && ($ifStmt->elseifs !== [] || $ifStmt->else instanceof Else_)) { return false; } diff --git a/rules/Php84/NodeFactory/ForeachToArrayFindFactory.php b/rules/Php84/NodeFactory/ForeachToArrayFindFactory.php index 25340c3d82c..ba3dc5bb69a 100644 --- a/rules/Php84/NodeFactory/ForeachToArrayFindFactory.php +++ b/rules/Php84/NodeFactory/ForeachToArrayFindFactory.php @@ -17,6 +17,7 @@ use Rector\NodeManipulator\StmtsManipulator; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\NodeTypeResolver; +use Rector\Php84\NodeAnalyzer\ExprModifiedInConditionalAnalyzer; use Rector\Php84\NodeAnalyzer\ForeachKeyUsedInConditionalAnalyzer; use Rector\PhpParser\Comparing\NodeComparator; use Rector\PhpParser\Node\NodeFactory; @@ -34,7 +35,8 @@ public function __construct( private NodeComparator $nodeComparator, private NodeTypeResolver $nodeTypeResolver, private NodeFactory $nodeFactory, - private NodeNameResolver $nodeNameResolver + private NodeNameResolver $nodeNameResolver, + private ExprModifiedInConditionalAnalyzer $exprModifiedInConditionalAnalyzer ) { } @@ -145,6 +147,10 @@ private function isValidForeachStructure(Foreach_ $foreach, Variable $assignedVa return false; } + if ($this->exprModifiedInConditionalAnalyzer->isModified($firstStmt->cond)) { + return false; + } + $assignmentStmt = $firstStmt->stmts[0]; $breakStmt = $firstStmt->stmts[1];