From f7b780161a2b4da711cdd30f7073c8119589f27b Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 29 Aug 2025 14:42:07 +0700 Subject: [PATCH 1/2] [Php84] Skip value extraction on ForeachToArray* rules --- .../Fixture/skip_value_extraction.php.inc | 21 +++++++++++++++++++ .../ForeachKeyUsedInConditionalAnalyzer.php | 1 + .../Foreach_/ForeachToArrayAllRector.php | 4 ++++ .../Foreach_/ForeachToArrayAnyRector.php | 4 ++++ .../Foreach_/ForeachToArrayFindKeyRector.php | 4 ++++ .../Foreach_/ForeachToArrayFindRector.php | 4 ++++ 6 files changed, 38 insertions(+) create mode 100644 rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_value_extraction.php.inc diff --git a/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_value_extraction.php.inc b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_value_extraction.php.inc new file mode 100644 index 00000000000..705230ef01f --- /dev/null +++ b/rules-tests/Php84/Rector/Foreach_/ForeachToArrayAnyRector/Fixture/skip_value_extraction.php.inc @@ -0,0 +1,21 @@ + 'foo'], + ]; + + foreach ($data as ['type' => $currentType]) { + if ($currentType === $type) { + return true; + } + } + + return false; + } +} diff --git a/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php b/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php index 296b0f9833e..1127892d618 100644 --- a/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php +++ b/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; final readonly class ForeachKeyUsedInConditionalAnalyzer diff --git a/rules/Php84/Rector/Foreach_/ForeachToArrayAllRector.php b/rules/Php84/Rector/Foreach_/ForeachToArrayAllRector.php index 46481ad2338..96629535526 100644 --- a/rules/Php84/Rector/Foreach_/ForeachToArrayAllRector.php +++ b/rules/Php84/Rector/Foreach_/ForeachToArrayAllRector.php @@ -198,6 +198,10 @@ private function isValidForeachStructure(Foreach_ $foreach, Variable $assignedVa return false; } + if (! $foreach->valueVar instanceof Variable) { + return false; + } + $type = $this->nodeTypeResolver->getNativeType($foreach->expr); return $type->isArray() ->yes(); diff --git a/rules/Php84/Rector/Foreach_/ForeachToArrayAnyRector.php b/rules/Php84/Rector/Foreach_/ForeachToArrayAnyRector.php index e3c349273a4..9ddea5d90c2 100644 --- a/rules/Php84/Rector/Foreach_/ForeachToArrayAnyRector.php +++ b/rules/Php84/Rector/Foreach_/ForeachToArrayAnyRector.php @@ -312,6 +312,10 @@ private function isValidEarlyReturnForeachStructure(Foreach_ $foreach): bool return false; } + if (! $foreach->valueVar instanceof Variable) { + return false; + } + $type = $this->nodeTypeResolver->getNativeType($foreach->expr); return $type->isArray() diff --git a/rules/Php84/Rector/Foreach_/ForeachToArrayFindKeyRector.php b/rules/Php84/Rector/Foreach_/ForeachToArrayFindKeyRector.php index 7f26f4914a3..61f74fd1856 100644 --- a/rules/Php84/Rector/Foreach_/ForeachToArrayFindKeyRector.php +++ b/rules/Php84/Rector/Foreach_/ForeachToArrayFindKeyRector.php @@ -203,6 +203,10 @@ private function isValidForeachStructure(Foreach_ $foreach, Variable $assignedVa return false; } + if (! $foreach->valueVar instanceof Variable) { + return false; + } + $type = $this->nodeTypeResolver->getNativeType($foreach->expr); return $type->isArray() ->yes(); diff --git a/rules/Php84/Rector/Foreach_/ForeachToArrayFindRector.php b/rules/Php84/Rector/Foreach_/ForeachToArrayFindRector.php index 378f39a94da..8ce48ae1252 100644 --- a/rules/Php84/Rector/Foreach_/ForeachToArrayFindRector.php +++ b/rules/Php84/Rector/Foreach_/ForeachToArrayFindRector.php @@ -195,6 +195,10 @@ private function isValidForeachStructure(Foreach_ $foreach, Variable $assignedVa return false; } + if (! $foreach->valueVar instanceof Variable) { + return false; + } + $type = $this->nodeTypeResolver->getNativeType($foreach->expr); return $type->isArray() ->yes(); From c7abdf2529f4ab4c14f93fb8c9e3a1d6e89fef13 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 29 Aug 2025 07:44:59 +0000 Subject: [PATCH 2/2] [ci-review] Rector Rectify --- rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php | 1 - 1 file changed, 1 deletion(-) diff --git a/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php b/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php index 1127892d618..296b0f9833e 100644 --- a/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php +++ b/rules/Php84/NodeAnalyzer/ForeachKeyUsedInConditionalAnalyzer.php @@ -7,7 +7,6 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Variable; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PhpParser\Node\BetterNodeFinder; final readonly class ForeachKeyUsedInConditionalAnalyzer