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..1dbecabb 100644 --- a/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -6,9 +6,11 @@ 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; @@ -126,7 +128,11 @@ private function collectReturnArrayNodesFromClassMethod(ClassMethod $classMethod } foreach ($classMethod->stmts as $statement) { - if ($statement instanceof Return_) { + if ($statement instanceof Expression) { + $statement = $statement->expr; + } + + if ($statement instanceof Return_ || $statement instanceof YieldFrom) { $returnedExpr = $statement->expr; if (! $returnedExpr instanceof Array_) { return null; @@ -150,7 +156,14 @@ private function transformArrayToYieldsOnMethodNode(ClassMethod $classMethod, Ar $commentReturn = []; foreach ((array) $classMethod->stmts as $key => $classMethodStmt) { - if (! $classMethodStmt instanceof Return_) { + if ($classMethodStmt instanceof Expression) { + $classMethodStmt = $classMethodStmt->expr; + } + + if ( + ! $classMethodStmt instanceof Return_ + && ! $classMethodStmt instanceof YieldFrom + ) { continue; } 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;