diff --git a/rules/dead-code/src/UselessIfCondBeforeForeachDetector.php b/rules/dead-code/src/UselessIfCondBeforeForeachDetector.php index fbd3cc5a8c15..cb868dc9f3b5 100644 --- a/rules/dead-code/src/UselessIfCondBeforeForeachDetector.php +++ b/rules/dead-code/src/UselessIfCondBeforeForeachDetector.php @@ -12,7 +12,9 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\Empty_; use PhpParser\Node\Stmt\If_; +use PHPStan\Type\MixedType; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; +use Rector\NodeTypeResolver\NodeTypeResolver; final class UselessIfCondBeforeForeachDetector { @@ -21,9 +23,15 @@ final class UselessIfCondBeforeForeachDetector */ private $betterStandardPrinter; - public function __construct(BetterStandardPrinter $betterStandardPrinter) + /** + * @var NodeTypeResolver + */ + private $nodeTypeResolver; + + public function __construct(BetterStandardPrinter $betterStandardPrinter, NodeTypeResolver $nodeTypeResolver) { $this->betterStandardPrinter = $betterStandardPrinter; + $this->nodeTypeResolver = $nodeTypeResolver; } /** @@ -44,7 +52,14 @@ public function isMatchingNotEmpty(If_ $if, Expr $foreachExpr): bool /** @var Empty_ $empty */ $empty = $cond->expr; - return $this->betterStandardPrinter->areNodesEqual($empty->expr, $foreachExpr); + if (! $this->betterStandardPrinter->areNodesEqual($empty->expr, $foreachExpr)) { + return false; + } + + // is array though? + $arrayType = $this->nodeTypeResolver->resolve($empty->expr); + + return ! $arrayType instanceof MixedType; } /** diff --git a/rules/dead-code/tests/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/skip_dim_fetch.php.inc b/rules/dead-code/tests/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/skip_dim_fetch.php.inc new file mode 100644 index 000000000000..d11d728dabfe --- /dev/null +++ b/rules/dead-code/tests/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/skip_dim_fetch.php.inc @@ -0,0 +1,19 @@ +