diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc new file mode 100644 index 00000000..1b6cf78b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/multi_stmts_return.php.inc @@ -0,0 +1,56 @@ + +----- + diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc new file mode 100644 index 00000000..6eee4e9d --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_multiple.php.inc @@ -0,0 +1,28 @@ + diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc new file mode 100644 index 00000000..e2ceb145 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_with_return.php.inc @@ -0,0 +1,31 @@ + diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index fe64c818..71ccd6aa 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -6,6 +6,9 @@ use PhpParser\Node; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\AssignOp; +use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; @@ -42,7 +45,7 @@ public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, private readonly PhpDocTypeChanger $phpDocTypeChanger, - private readonly DocBlockUpdater $docBlockUpdater + private readonly DocBlockUpdater $docBlockUpdater, ) { } @@ -127,13 +130,13 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return null; } - $totalStmts = count($classMethod->stmts); + $yieldedFromExpr = null; foreach ($classMethod->stmts as $statement) { if ($statement instanceof Expression) { $statement = $statement->expr; } - if ($statement instanceof Return_ || ($statement instanceof YieldFrom && $totalStmts === 1)) { + if ($statement instanceof Return_) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; @@ -141,9 +144,27 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod return $returnedExpr; } + + if ($statement instanceof YieldFrom) { + if (! $statement->expr instanceof Array_) { + return null; + } + + if ($yieldedFromExpr instanceof Array_) { + return null; + } + + $yieldedFromExpr = $statement->expr; + } elseif ( + ! $statement instanceof Assign + && ! $statement instanceof AssignRef + && ! $statement instanceof AssignOp + ) { + return null; + } } - return null; + return $yieldedFromExpr; } private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Array_ $array): void