From c60b407ae0f3cb1e50a61917aecaa5ee4652107a Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 18 Oct 2025 21:07:52 +0200 Subject: [PATCH 1/4] Turn `yield from` into multiple `yield` in PHPUnit Dataprovider --- .../Fixture/skip_yield_from_expr.php.inc | 28 ++++++++++ .../Fixture/yield_from.php.inc | 51 +++++++++++++++++++ .../Rector/Class_/YieldDataProviderRector.php | 16 +++++- 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_expr.php.inc create mode 100644 rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/yield_from.php.inc diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_expr.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_expr.php.inc new file mode 100644 index 00000000..8917f48b --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/skip_yield_from_expr.php.inc @@ -0,0 +1,28 @@ + diff --git a/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/yield_from.php.inc b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/yield_from.php.inc new file mode 100644 index 00000000..6b88fa65 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/Class_/YieldDataProviderRector/Fixture/yield_from.php.inc @@ -0,0 +1,51 @@ + +----- + diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index bc0273d8..efca5ce2 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\Array_; +use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; @@ -126,7 +127,11 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } foreach ($classMethod->stmts as $statement) { - if ($statement instanceof Return_) { + if ($statement instanceof Node\Stmt\Expression) { + $statement = $statement->expr; + } + + if ($statement instanceof Return_ || $statement instanceof YieldFrom) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; @@ -150,7 +155,14 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar $commentReturn = []; foreach ((array) $classMethod->stmts as $key => $classMethodStmt) { - if (! $classMethodStmt instanceof Return_) { + if ($classMethodStmt instanceof Node\Stmt\Expression) { + $classMethodStmt = $classMethodStmt->expr; + } + + if ( + ! $classMethodStmt instanceof Return_ + && ! $classMethodStmt instanceof YieldFrom + ) { continue; } From 96079e3cda1bd8fb67c151594d81937437fb5455 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 18 Oct 2025 21:09:56 +0200 Subject: [PATCH 2/4] fix CS --- rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index efca5ce2..83a4a839 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -4,6 +4,7 @@ namespace Rector\PHPUnit\CodeQuality\Rector\Class_; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\YieldFrom; @@ -127,7 +128,7 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } foreach ($classMethod->stmts as $statement) { - if ($statement instanceof Node\Stmt\Expression) { + if ($statement instanceof Expression) { $statement = $statement->expr; } @@ -155,7 +156,7 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar $commentReturn = []; foreach ((array) $classMethod->stmts as $key => $classMethodStmt) { - if ($classMethodStmt instanceof Node\Stmt\Expression) { + if ($classMethodStmt instanceof Expression) { $classMethodStmt = $classMethodStmt->expr; } From d0b7062de7130aacd85d29f3f24aa94aa15f4ab7 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 18 Oct 2025 21:11:55 +0200 Subject: [PATCH 3/4] fix unrelated build error --- .../Reflection/MethodParametersAndReturnTypesResolver.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php b/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php index fd31f59b..190d58f4 100644 --- a/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php +++ b/rules/CodeQuality/Reflection/MethodParametersAndReturnTypesResolver.php @@ -186,8 +186,8 @@ public function resolveParameterTypes( ); $parameterTypes = []; - foreach ($extendedParametersAcceptor->getParameters() as $parameterReflection) { - $parameterType = $this->resolveObjectType($parameterReflection->getNativeType()); + foreach ($extendedParametersAcceptor->getParameters() as $extendedParameterReflection) { + $parameterType = $this->resolveObjectType($extendedParameterReflection->getNativeType()); if ($parameterType instanceof ObjectType && $currentClassReflection->getName() !== $parameterType->getClassReflection()?->getName()) { $parameterTypes[] = new MixedType(); @@ -210,8 +210,8 @@ private function resolveParameterNames(ExtendedMethodReflection $extendedMethodR ); $parameterNames = []; - foreach ($extendedParametersAcceptor->getParameters() as $parameterReflection) { - $parameterNames[] = $parameterReflection->getName(); + foreach ($extendedParametersAcceptor->getParameters() as $extendedParameterReflection) { + $parameterNames[] = $extendedParameterReflection->getName(); } return $parameterNames; From 0e2e2b00dca1c872e3eb527dc1f2e7c54a95b728 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sat, 18 Oct 2025 21:15:19 +0200 Subject: [PATCH 4/4] Update YieldDataProviderRector.php --- rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index 83a4a839..1dbecabb 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -4,13 +4,13 @@ namespace Rector\PHPUnit\CodeQuality\Rector\Class_; -use PhpParser\Node\Stmt\Expression; use PhpParser\Node; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\YieldFrom; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\Type\Generic\GenericObjectType;