From 06ed79ee4d489dd0cccf045cd8d894f31ecc275e Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 1 Oct 2025 12:01:45 +0200 Subject: [PATCH 1/2] add nested assign fixture --- .../Fixture/float_assigns.php.inc | 36 +++++++++++++++++++ .../Fixture/nested_assign.php.inc | 19 ++++++++++ .../Fixture/simple_array_assigns.php.inc | 19 ---------- 3 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/float_assigns.php.inc create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/float_assigns.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/float_assigns.php.inc new file mode 100644 index 00000000000..5024f967cc7 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/float_assigns.php.inc @@ -0,0 +1,36 @@ + +----- + diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc new file mode 100644 index 00000000000..89317f8038c --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc @@ -0,0 +1,19 @@ + +----- + diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/simple_array_assigns.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/simple_array_assigns.php.inc index 2e1609081e2..593db6322ba 100644 --- a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/simple_array_assigns.php.inc +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/simple_array_assigns.php.inc @@ -28,14 +28,6 @@ class SomeClass $numbers[] = 3; return $numbers; } - - public function getFloatItems() - { - $floats = []; - $floats[] = 1.5; - $floats[] = 2.5; - return $floats; - } } function withNativeArrayType(): array @@ -98,17 +90,6 @@ class SomeClass $numbers[] = 3; return $numbers; } - - /** - * @return float[] - */ - public function getFloatItems() - { - $floats = []; - $floats[] = 1.5; - $floats[] = 2.5; - return $floats; - } } /** From 68093a91351c8156522094d7937dda7511c1d270 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 1 Oct 2025 12:09:43 +0200 Subject: [PATCH 2/2] Add strict scalar type support to AddReturnDocblockForScalarArrayFromAssignsRector --- .../Fixture/nested_assign.php.inc | 39 +++++++++++++++++++ ...ocblockForScalarArrayFromAssignsRector.php | 7 ++++ 2 files changed, 46 insertions(+) diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc index 89317f8038c..e36bcf3e13c 100644 --- a/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector/Fixture/nested_assign.php.inc @@ -4,6 +4,24 @@ namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddReturnDocblockForSc class NestedAssign { + private function someMethod(string $path): array + { + $stringLength = strlen($path); + + $items = []; + $currentdItem = ''; + + for ($i = 0; $i < $stringLength; $i++) { + $currentdItem = (string) $path[$i]; + } + + if ($currentdItem !== '') { + $items[] = $currentdItem; + } + + return $items; + } + } ?> @@ -14,6 +32,27 @@ namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddReturnDocblockForSc class NestedAssign { + /** + * @return string[] + */ + private function someMethod(string $path): array + { + $stringLength = strlen($path); + + $items = []; + $currentdItem = ''; + + for ($i = 0; $i < $stringLength; $i++) { + $currentdItem = (string) $path[$i]; + } + + if ($currentdItem !== '') { + $items[] = $currentdItem; + } + + return $items; + } + } ?> diff --git a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector.php b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector.php index 8e4a05e1fc2..8185bd43396 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/AddReturnDocblockForScalarArrayFromAssignsRector.php @@ -135,6 +135,7 @@ public function refactor(Node $node): ?Node $scalarArrayTypes = []; foreach ($returnedVariableNames as $returnedVariableName) { $scalarType = $this->resolveScalarArrayTypeForVariable($node, $returnedVariableName); + if ($scalarType instanceof Type) { $scalarArrayTypes[] = $scalarType; } else { @@ -219,6 +220,7 @@ private function resolveScalarArrayTypeForVariable(ClassMethod|Function_ $node, $arrayHasDimAssigns = true; $scalarType = $this->resolveScalarType($assign->expr); + if ($scalarType instanceof Type) { $scalarTypes[] = $scalarType; } else { @@ -258,6 +260,11 @@ private function resolveScalarType(Expr $expr): ?Type return new FloatType(); } + $exprType = $this->nodeTypeResolver->getNativeType($expr); + if ($exprType->isScalar()->yes()) { + return $exprType; + } + return null; } }