From 3879898b99c01fba03a71b3f9354d9400cee859c Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 15 Sep 2025 09:56:38 +0200 Subject: [PATCH 1/2] add two nested level fixture --- .../Fixture/two_nested_levels.php.inc | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/two_nested_levels.php.inc diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/two_nested_levels.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/two_nested_levels.php.inc new file mode 100644 index 00000000000..5ad4b578ba7 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/two_nested_levels.php.inc @@ -0,0 +1,48 @@ + [ + 'id' => 1, + 'name' => '111', + ], + 'another_key' => [ + 'id' => 1, + 'name' => '111', + ], + ]; + } +} + +?> +----- +> + */ + public function run(): array + { + return [ + 'key' => [ + 'id' => 1, + 'name' => '111', + ], + 'another_key' => [ + 'id' => 1, + 'name' => '111', + ], + ]; + } +} + +?> From 732444f583e4075b3cd90f4aafa76c414ea32e5c Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 15 Sep 2025 10:01:03 +0200 Subject: [PATCH 2/2] keep unioned types scalar --- .../Enum_/EnumCaseToPascalCaseRector.php | 1 + ...turnArrayFromDirectArrayInstanceRector.php | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php b/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php index 2b6f80b520a..e3b48e80ded 100644 --- a/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php +++ b/rules/CodingStyle/Rector/Enum_/EnumCaseToPascalCaseRector.php @@ -195,6 +195,7 @@ private function isEnumCase(ClassReflection $classReflection, string $name, stri if ($classReflection->hasEnumCase($name)) { return true; } + return $classReflection->hasEnumCase($pascalName); } diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php index 5230c2b6140..3d9ad973c4f 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php @@ -16,12 +16,15 @@ use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; +use PHPStan\Type\IntersectionType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\UnionType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\Rector\AbstractRector; use Rector\StaticTypeMapper\StaticTypeMapper; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -35,7 +38,8 @@ final class DocblockReturnArrayFromDirectArrayInstanceRector extends AbstractRec public function __construct( private readonly PhpDocInfoFactory $phpDocInfoFactory, private readonly DocBlockUpdater $docBlockUpdater, - private readonly StaticTypeMapper $staticTypeMapper + private readonly StaticTypeMapper $staticTypeMapper, + private readonly TypeFactory $typeFactory ) { } @@ -145,6 +149,20 @@ private function constantToGenericType(Type $type): Type return new FloatType(); } + if ($type instanceof UnionType || $type instanceof IntersectionType) { + $genericComplexTypes = []; + foreach ($type->getTypes() as $splitType) { + $genericComplexTypes[] = $this->constantToGenericType($splitType); + } + + $genericComplexTypes = $this->typeFactory->uniquateTypes($genericComplexTypes); + if (count($genericComplexTypes) > 1) { + return new UnionType($genericComplexTypes); + } + + return $genericComplexTypes[0]; + } + // unclear return new MixedType(); }