diff --git a/rules-tests/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector/Fixture/on_return.php.inc b/rules-tests/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector/Fixture/on_return.php.inc new file mode 100644 index 00000000..40d3e2f3 --- /dev/null +++ b/rules-tests/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector/Fixture/on_return.php.inc @@ -0,0 +1,34 @@ + str_starts_with($animal, 'c')); + } +} + +?> +----- + diff --git a/rules/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector.php b/rules/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector.php index ad2a90b1..fc2e2d06 100644 --- a/rules/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector.php +++ b/rules/DowngradePhp84/Rector/Expression/DowngradeArrayAnyRector.php @@ -9,12 +9,16 @@ use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\FuncCall; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Break_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; +use PhpParser\Node\Stmt\Return_; +use Rector\Naming\Naming\VariableNaming; +use Rector\PHPStan\ScopeFetcher; use Rector\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,9 +30,14 @@ */ final class DowngradeArrayAnyRector extends AbstractRector { + public function __construct( + private readonly VariableNaming $variableNaming + ) { + } + public function getNodeTypes(): array { - return [Expression::class]; + return [Expression::class, Return_::class]; } public function getRuleDefinition(): RuleDefinition @@ -56,28 +65,36 @@ public function getRuleDefinition(): RuleDefinition } /** - * @param Expression $node + * @param Expression|Return_ $node * @return Stmt[]|null */ public function refactor(Node $node): ?array { - if (! $node->expr instanceof Assign) { + if ($node instanceof Return_ && ! $node->expr instanceof FuncCall) { + return null; + } + + if ($node instanceof Expression && ! $node->expr instanceof Assign) { return null; } - if (! $node->expr->expr instanceof FuncCall) { + $expr = $node instanceof Expression && $node->expr instanceof Assign + ? $node->expr->expr + : $node->expr; + + if (! $expr instanceof FuncCall) { return null; } - if (! $this->isName($node->expr->expr, 'array_any')) { + if (! $this->isName($expr, 'array_any')) { return null; } - if ($node->expr->expr->isFirstClassCallable()) { + if ($expr->isFirstClassCallable()) { return null; } - $args = $node->expr->expr->getArgs(); + $args = $expr->getArgs(); if (count($args) !== 2) { return null; } @@ -86,17 +103,19 @@ public function refactor(Node $node): ?array return null; } + $scope = ScopeFetcher::fetch($node); + $variable = $node instanceof Expression && $node->expr instanceof Assign + ? $node->expr->var + : new Variable($this->variableNaming->createCountedValueName('found', $scope)); + $valueCond = $args[1]->value->expr; $if = new If_($valueCond, [ - 'stmts' => [ - new Expression(new Assign($node->expr->var, new ConstFetch(new Name('true')))), - new Break_(), - ], + 'stmts' => [new Expression(new Assign($variable, new ConstFetch(new Name('true')))), new Break_()], ]); - return [ + $result = [ // init - new Expression(new Assign($node->expr->var, new ConstFetch(new Name('false')))), + new Expression(new Assign($variable, new ConstFetch(new Name('false')))), // foreach loop new Foreach_( @@ -112,5 +131,11 @@ public function refactor(Node $node): ?array ], ), ]; + + if ($node instanceof Return_) { + $result[] = new Return_($variable); + } + + return $result; } }