From b28277ca6bf156c98a5a0c80aaf244d6e0e10839 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 30 Sep 2025 00:48:52 +0200 Subject: [PATCH 1/2] skip object types in DocblockReturnArrayFromDirectArrayInstanceRector --- rector.php | 2 +- .../Fixture/Nesting/complex_array.php.inc | 4 +- .../Fixture/skip_sole_type.php.inc | 25 ++++++ .../Fixture/strip_empty_combine.php.inc | 78 ------------------- ...turnArrayFromDirectArrayInstanceRector.php | 2 +- 5 files changed, 28 insertions(+), 83 deletions(-) create mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/skip_sole_type.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/strip_empty_combine.php.inc diff --git a/rector.php b/rector.php index d8bdd5c82e5..b24f7fe82f0 100644 --- a/rector.php +++ b/rector.php @@ -13,7 +13,7 @@ codeQuality: true, codingStyle: true, typeDeclarations: true, - // typeDeclarationDocblocks: true, + typeDeclarationDocblocks: true, privatization: true, naming: true, instanceOf: true, diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/Nesting/complex_array.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/Nesting/complex_array.php.inc index 3fa83eabde8..e294c99e80d 100644 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/Nesting/complex_array.php.inc +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/Nesting/complex_array.php.inc @@ -7,7 +7,6 @@ class ComplexArray public function run(): array { return [ - 'id' => new \stdClass(), 'other' => false, 'context' => [ 'id' => 1, @@ -37,12 +36,11 @@ namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\DocblockRetur class ComplexArray { /** - * @return array + * @return array|int>|array|bool> */ public function run(): array { return [ - 'id' => new \stdClass(), 'other' => false, 'context' => [ 'id' => 1, diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/skip_sole_type.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/skip_sole_type.php.inc new file mode 100644 index 00000000000..f9288e5ec18 --- /dev/null +++ b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector/Fixture/skip_sole_type.php.inc @@ -0,0 +1,25 @@ + false, - 'b' => 'b', - 'c' => true, - 'd' => $this->getNullable(), - 'class' => StripEmptyCombine::class, - 'opt' => [], - 'init' => false, - 'attrs' => [ - 'x' => 'x', - 'class' => 'pick', - 'apply' => 'true', - 'head' => $this->trans('foo'), - ], - ]; - } - - private function getNullable(): ?string - { - return null; - } - - function trans(): string - { - return 'foo'; - } -} - -?> ------ -|null> - */ - public function get(): array - { - return [ - 'a' => false, - 'b' => 'b', - 'c' => true, - 'd' => $this->getNullable(), - 'class' => StripEmptyCombine::class, - 'opt' => [], - 'init' => false, - 'attrs' => [ - 'x' => 'x', - 'class' => 'pick', - 'apply' => 'true', - 'head' => $this->trans('foo'), - ], - ]; - } - - private function getNullable(): ?string - { - return null; - } - - function trans(): string - { - return 'foo'; - } -} - -?> diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php index f896f2affba..2ffdc107376 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php @@ -106,7 +106,7 @@ public function refactor(Node $node): ?Node return null; } - if (count($returnedType->getReferencedClasses()) > 1) { + if ($returnedType->getReferencedClasses() !== []) { // better handled by shared-interface/class rule, to avoid turning objects to mixed return null; } From 3795feca55557a990f9537a9731203144f6e8f2e Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 30 Sep 2025 00:49:53 +0200 Subject: [PATCH 2/2] fill known array types --- .../Rector/FunctionLike/SimplifyUselessVariableRector.php | 3 +++ .../Rector/Encapsed/EncapsedStringsToSprintfRector.php | 3 +++ .../Class_/ClassPropertyAssignToConstructorPromotionRector.php | 3 +++ .../Rector/Property/TypedPropertyFromAssignsRector.php | 3 +++ .../StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php | 3 +++ 5 files changed, 15 insertions(+) diff --git a/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php b/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php index 60fc781ca21..0f9714edbac 100644 --- a/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php +++ b/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php @@ -46,6 +46,9 @@ public function __construct( ) { } + /** + * @param array $configuration + */ public function configure(array $configuration): void { $this->onlyDirectAssign = $configuration[self::ONLY_DIRECT_ASSIGN] ?? false; diff --git a/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php b/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php index 4d4081c1a64..656d159e88a 100644 --- a/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php +++ b/rules/CodingStyle/Rector/Encapsed/EncapsedStringsToSprintfRector.php @@ -55,6 +55,9 @@ final class EncapsedStringsToSprintfRector extends AbstractRector implements Con */ private array $argumentVariables = []; + /** + * @param array $configuration + */ public function configure(array $configuration): void { $this->always = $configuration[self::ALWAYS] ?? false; diff --git a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index 89cf185b7dd..cb68fc734b6 100644 --- a/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -137,6 +137,9 @@ public function __construct( ); } + /** + * @param array $configuration + */ public function configure(array $configuration): void { $this->inlinePublic = $configuration[self::INLINE_PUBLIC] ?? false; diff --git a/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php b/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php index 2f27b7e950e..7d670e0c6a1 100644 --- a/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php +++ b/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php @@ -68,6 +68,9 @@ public function __construct( ) { } + /** + * @param array $configuration + */ public function configure(array $configuration): void { $this->inlinePublic = $configuration[self::INLINE_PUBLIC] ?? (bool) current($configuration); diff --git a/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php b/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php index 2dd904e0477..23a79200535 100644 --- a/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php +++ b/rules/TypeDeclaration/Rector/StmtsAwareInterface/IncreaseDeclareStrictTypesRector.php @@ -121,6 +121,9 @@ public function refactor(Node $node): ?Node return null; } + /** + * @param array $configuration + */ public function configure(array $configuration): void { Assert::keyExists($configuration, self::LIMIT);