diff --git a/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php b/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php index e0c0e439292..53a18179994 100644 --- a/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php +++ b/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php @@ -458,7 +458,10 @@ public function getAnnotationClassNames(): array public function getGenericTagClassNames(): array { /** @var GenericTagValueNode[] $genericTagValueNodes */ - $genericTagValueNodes = $this->phpDocNodeByTypeFinder->findByType($this->phpDocNode, GenericTagValueNode::class); + $genericTagValueNodes = $this->phpDocNodeByTypeFinder->findByType( + $this->phpDocNode, + GenericTagValueNode::class + ); $resolvedClasses = []; diff --git a/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php b/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php index 77a9eafec59..64ddd11a13f 100644 --- a/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php +++ b/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php @@ -175,7 +175,7 @@ private function shouldSkipHasChildHasReturnType(array $childrenClassReflections } $childReturnType = $this->returnTypeInferer->inferFunctionLike($method); - if (!$returnType->isVoid()->yes()) { + if (! $returnType->isVoid()->yes()) { continue; } diff --git a/rules-tests/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/if_non_empty_and_bigger_than_zero.php.inc b/rules-tests/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/if_non_empty_and_bigger_than_zero.php.inc new file mode 100644 index 00000000000..583c4009924 --- /dev/null +++ b/rules-tests/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector/Fixture/if_non_empty_and_bigger_than_zero.php.inc @@ -0,0 +1,33 @@ + 0) { + foreach ($items as $item) { + echo $item; + } + } + } +} + +?> +----- + diff --git a/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php b/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php index a34d449bbd8..b7dc58208f6 100644 --- a/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php +++ b/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php @@ -5,6 +5,8 @@ namespace Rector\DeadCode\Rector\If_; use PhpParser\Node; +use PhpParser\Node\Expr; +use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Foreach_; @@ -118,11 +120,16 @@ private function isUselessBeforeForeachCheck(If_ $if, Scope $scope): bool } } - if (($if->cond instanceof Variable || $this->propertyFetchAnalyzer->isPropertyFetch($if->cond)) - && $this->nodeComparator->areNodesEqual($if->cond, $foreachExpr) + $ifCond = $if->cond; + if ($ifCond instanceof BooleanAnd) { + return $this->isUselessBooleanAnd($ifCond, $foreachExpr); + } + + if (($ifCond instanceof Variable || $this->propertyFetchAnalyzer->isPropertyFetch($ifCond)) + && $this->nodeComparator->areNodesEqual($ifCond, $foreachExpr) ) { - return $scope->getType($if->cond) - ->isArray() + $ifType = $scope->getType($ifCond); + return $ifType->isArray() ->yes(); } @@ -136,4 +143,17 @@ private function isUselessBeforeForeachCheck(If_ $if, Scope $scope): bool return $this->countManipulator->isCounterHigherThanOne($if->cond, $foreachExpr); } + + private function isUselessBooleanAnd(BooleanAnd $booleanAnd, Expr $foreachExpr): bool + { + if (! $booleanAnd->left instanceof Variable) { + return false; + } + + if (! $this->nodeComparator->areNodesEqual($booleanAnd->left, $foreachExpr)) { + return false; + } + + return $this->countManipulator->isCounterHigherThanOne($booleanAnd->right, $foreachExpr); + } } diff --git a/rules/Php72/NodeFactory/AnonymousFunctionFactory.php b/rules/Php72/NodeFactory/AnonymousFunctionFactory.php index 20a6717cf39..5744fea1067 100644 --- a/rules/Php72/NodeFactory/AnonymousFunctionFactory.php +++ b/rules/Php72/NodeFactory/AnonymousFunctionFactory.php @@ -36,7 +36,6 @@ use PHPStan\Reflection\Php\PhpMethodReflection; use PHPStan\Type\MixedType; use PHPStan\Type\Type; -use PHPStan\Type\VoidType; use Rector\Core\PhpParser\AstResolver; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Node\NodeFactory; diff --git a/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php b/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php index 90e7ac89064..520e779aefc 100644 --- a/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php +++ b/rules/Php72/Rector/FuncCall/ParseStrWithResultArgumentRector.php @@ -94,7 +94,10 @@ private function processStrWithResult( $expr->args[1] = new Arg($resultVariable); $nextExpression = $stmtsAware->stmts[$key + 1]; - $this->traverseNodesWithCallable($nextExpression, function (Node $node) use ($resultVariable, &$hasChanged): ?Variable { + $this->traverseNodesWithCallable($nextExpression, function (Node $node) use ( + $resultVariable, + &$hasChanged + ): ?Variable { if (! $node instanceof FuncCall) { return null; } diff --git a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php index 3ae8c01e70c..cc1ee19233f 100644 --- a/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php +++ b/rules/TypeDeclaration/TypeInferer/ReturnTypeInferer.php @@ -23,7 +23,6 @@ use PHPStan\Type\Type; use PHPStan\Type\TypeWithClassName; use PHPStan\Type\UnionType; -use PHPStan\Type\VoidType; use Rector\Core\Enum\ObjectReference; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\Php\PhpVersionProvider;