From e6f6da66f72a3b8f13d18734eccd51491b3ffc35 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 30 Jul 2026 23:40:32 +0200 Subject: [PATCH 1/2] [TypeDeclarationDocblocks] Deprecate AddReturnArrayDocblockFromDataProviderParamRector Data provider docblock typing is not relevant to code quality. It adds maintenance cost and lowers readability of the test class. --- ...ocblockFromDataProviderParamRectorTest.php | 28 ----- .../Fixture/return_from_strict_param.php.inc | 46 -------- .../Fixture/skip_iterator.php.inc | 19 ---- .../Fixture/skip_multiple_params.php.inc | 19 ---- .../config/configured_rule.php | 10 -- ...rayDocblockFromDataProviderParamRector.php | 103 ++---------------- 6 files changed, 8 insertions(+), 217 deletions(-) delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/AddReturnArrayDocblockFromDataProviderParamRectorTest.php delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/return_from_strict_param.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/skip_iterator.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/skip_multiple_params.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/config/configured_rule.php diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/AddReturnArrayDocblockFromDataProviderParamRectorTest.php b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/AddReturnArrayDocblockFromDataProviderParamRectorTest.php deleted file mode 100644 index 9d5579887b2..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/AddReturnArrayDocblockFromDataProviderParamRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/return_from_strict_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/return_from_strict_param.php.inc deleted file mode 100644 index c31b7cac233..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/return_from_strict_param.php.inc +++ /dev/null @@ -1,46 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/skip_iterator.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/skip_iterator.php.inc deleted file mode 100644 index 89708d48f27..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector/Fixture/skip_iterator.php.inc +++ /dev/null @@ -1,19 +0,0 @@ -rule(AddReturnArrayDocblockFromDataProviderParamRector::class); -}; diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php index a9b357e74fa..abef685237d 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php @@ -5,34 +5,18 @@ namespace Rector\TypeDeclarationDocblocks\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\Class_; -use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; -use PHPStan\Type\ArrayType; -use PHPStan\Type\MixedType; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Comments\NodeDocBlock\DocBlockUpdater; -use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\StaticTypeMapper\StaticTypeMapper; -use Rector\TypeDeclarationDocblocks\NodeFinder\DataProviderMethodsFinder; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\AddReturnArrayDocblockFromDataProviderParamRector\AddReturnArrayDocblockFromDataProviderParamRectorTest + * @deprecated This rule is deprecated, as data provider docblock typing is not relevant to code quality. It increases maintenance cost and decreases readability. */ -final class AddReturnArrayDocblockFromDataProviderParamRector extends AbstractRector +final class AddReturnArrayDocblockFromDataProviderParamRector extends AbstractRector implements DeprecatedInterface { - public function __construct( - private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly StaticTypeMapper $staticTypeMapper, - private readonly TestsNodeAnalyzer $testsNodeAnalyzer, - private readonly DataProviderMethodsFinder $dataProviderMethodsFinder, - private readonly DocBlockUpdater $docBlockUpdater, - ) { - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Add @return array return from data provider param type', [ @@ -81,9 +65,6 @@ public function provideNames(): array ]); } - /** - * @return array> - */ public function getNodeTypes(): array { return [Class_::class]; @@ -94,77 +75,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $this->testsNodeAnalyzer->isInTestClass($node)) { - return null; - } - - $hasChanged = false; - - foreach ($node->getMethods() as $classMethod) { - if (! $classMethod->isPublic()) { - continue; - } - - if (! $this->testsNodeAnalyzer->isTestClassMethod($classMethod)) { - continue; - } - - // sole param required - if (count($classMethod->getParams()) !== 1) { - continue; - } - - $dataProviderNodes = $this->dataProviderMethodsFinder->findDataProviderNodes($node, $classMethod); - - $paramTypesByPosition = []; - foreach ($classMethod->getParams() as $position => $param) { - if (! $param->type instanceof Node) { - continue; - } - - $paramTypesByPosition[$position] = $param->type; - } - - if ($paramTypesByPosition === []) { - continue; - } - - foreach ($dataProviderNodes->getClassMethods() as $dataProviderClassMethod) { - if (! $dataProviderClassMethod->returnType instanceof Identifier) { - continue; - } - - if (! $this->isName($dataProviderClassMethod->returnType, 'array')) { - continue; - } - - // already set return tag - $dataProviderPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($dataProviderClassMethod); - if ($dataProviderPhpDocInfo->getReturnTagValue() instanceof ReturnTagValueNode) { - continue; - } - - $paramTypeNode = $paramTypesByPosition[0]; - $returnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($paramTypeNode); - $arrayReturnType = new ArrayType(new MixedType(), $returnType); - - $arrayReturnTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPHPStanPhpDocTypeNode( - $arrayReturnType, - ); - - $returnTagValueNode = new ReturnTagValueNode($arrayReturnTypeNode, ''); - - $dataProviderPhpDocInfo->addTagValueNode($returnTagValueNode); - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($dataProviderClassMethod); - - $hasChanged = true; - } - } - - if (! $hasChanged) { - return null; - } - - return $node; + throw new ShouldNotHappenException(sprintf( + '"%s" is deprecated, as data provider docblock typing is not relevant to code quality', + self::class + )); } } From 173e8daa5e278ac4d85af8139c6796ba0ffe4410 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 30 Jul 2026 23:45:31 +0200 Subject: [PATCH 2/2] [TypeDeclarationDocblocks] Deprecate AddReturnDocblockDataProviderRector and AddParamArrayDocblockFromDataProviderRector Same reasoning as the data provider return docblock rule: docblock typing of data providers is not relevant to code quality, costs maintenance and lowers readability. Both rules are removed from the TypeDeclarationDocblocks level. --- ...rrayDocblockFromDataProviderRectorTest.php | 28 ----- .../Fixture/complex_case.php.inc | 111 ------------------ .../cover_dummy_iterable_param.php.inc | 53 --------- .../Fixture/cover_iterable.php.inc | 50 -------- .../Fixture/multiple_options.php.inc | 50 -------- .../override_dummy_array_param.php.inc | 49 -------- .../Fixture/skip_mixed.php.inc | 22 ---- .../skip_mixed_from_param_array.php.inc | 24 ---- .../some_test_with_data_provider.php.inc | 46 -------- .../config/configured_rule.php | 9 -- ...ddReturnDocblockDataProviderRectorTest.php | 28 ----- .../already_return_typed_generator.php.inc | 48 -------- .../codeception_data_provider_method.php.inc | 52 -------- .../Fixture/data_provider_method.php.inc | 52 -------- .../Fixture/keep_string_type_simple.php.inc | 54 --------- .../Fixture/multi_objects.php.inc | 52 -------- .../Fixture/nested_array_is_mixed.php.inc | 48 -------- .../override_dummy_array_return.php.inc | 55 --------- .../Fixture/override_dummy_mixed.php.inc | 55 --------- .../override_dummy_mixed_array.php.inc | 55 --------- .../Fixture/skip_already_set_type.php.inc | 37 ------ .../Fixture/union_same_array_type.php.inc | 60 ---------- .../Fixture/with_integers.php.inc | 52 -------- .../Fixture/yield_provider.php.inc | 48 -------- .../Fixture/yield_provider_iterable.php.inc | 66 ----------- .../config/configured_rule.php | 10 -- ...ramArrayDocblockFromDataProviderRector.php | 93 ++------------- .../AddReturnDocblockDataProviderRector.php | 106 ++--------------- .../Level/TypeDeclarationDocblocksLevel.php | 6 - 29 files changed, 16 insertions(+), 1403 deletions(-) delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/AddParamArrayDocblockFromDataProviderRectorTest.php delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/complex_case.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_dummy_iterable_param.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_iterable.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/multiple_options.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/skip_mixed.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/skip_mixed_from_param_array.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/some_test_with_data_provider.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/config/configured_rule.php delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/AddReturnDocblockDataProviderRectorTest.php delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/already_return_typed_generator.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/codeception_data_provider_method.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/data_provider_method.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/keep_string_type_simple.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/multi_objects.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/nested_array_is_mixed.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_array_return.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/skip_already_set_type.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/union_same_array_type.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/with_integers.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider_iterable.php.inc delete mode 100644 rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/config/configured_rule.php diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/AddParamArrayDocblockFromDataProviderRectorTest.php b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/AddParamArrayDocblockFromDataProviderRectorTest.php deleted file mode 100644 index b9bcc91f16f..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/AddParamArrayDocblockFromDataProviderRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/complex_case.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/complex_case.php.inc deleted file mode 100644 index b02fd83874b..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/complex_case.php.inc +++ /dev/null @@ -1,111 +0,0 @@ - [ - 'anotherKey' => 123, - ], - ], - [ - 'expectedKey' => 456, - ], - 456, - ]; - yield [ - [], - [ - 'expectedKey' => 456, - ], - 456, - ]; - yield [ - [ - 'key' => [ - 'anotherKey' => 123, - ], - ], - [], - 123, - ]; - yield [ - [], - [], - 5, - ]; - } - -} - -?> ------ -> $first - * @param array $second - */ - #[DataProvider('getData')] - public function testSomething(array $first, array $second, int $expected): void - { - } - - public static function getData(): \Iterator - { - yield [ - [ - 'key' => [ - 'anotherKey' => 123, - ], - ], - [ - 'expectedKey' => 456, - ], - 456, - ]; - yield [ - [], - [ - 'expectedKey' => 456, - ], - 456, - ]; - yield [ - [ - 'key' => [ - 'anotherKey' => 123, - ], - ], - [], - 123, - ]; - yield [ - [], - [], - 5, - ]; - } - -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_dummy_iterable_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_dummy_iterable_param.php.inc deleted file mode 100644 index f3058ce4729..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_dummy_iterable_param.php.inc +++ /dev/null @@ -1,53 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_iterable.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_iterable.php.inc deleted file mode 100644 index 99ff2522670..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/cover_iterable.php.inc +++ /dev/null @@ -1,50 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/multiple_options.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/multiple_options.php.inc deleted file mode 100644 index 38ae3020ca5..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/multiple_options.php.inc +++ /dev/null @@ -1,50 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc deleted file mode 100644 index fe34b5646a1..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/override_dummy_array_param.php.inc +++ /dev/null @@ -1,49 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/skip_mixed.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/skip_mixed.php.inc deleted file mode 100644 index b1cf1f647ab..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/Fixture/skip_mixed.php.inc +++ /dev/null @@ -1,22 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/config/configured_rule.php b/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/config/configured_rule.php deleted file mode 100644 index 1bfdc172f37..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([AddParamArrayDocblockFromDataProviderRector::class]); diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/AddReturnDocblockDataProviderRectorTest.php b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/AddReturnDocblockDataProviderRectorTest.php deleted file mode 100644 index 51ee9981864..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/AddReturnDocblockDataProviderRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/already_return_typed_generator.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/already_return_typed_generator.php.inc deleted file mode 100644 index 647710a4407..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/already_return_typed_generator.php.inc +++ /dev/null @@ -1,48 +0,0 @@ - ------ -> - */ - public static function provideData(): \Generator - { - yield ['data1', 'data2']; - yield ['item4', 'item5']; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/codeception_data_provider_method.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/codeception_data_provider_method.php.inc deleted file mode 100644 index ede4f21e82c..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/codeception_data_provider_method.php.inc +++ /dev/null @@ -1,52 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/data_provider_method.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/data_provider_method.php.inc deleted file mode 100644 index a30db6c0761..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/data_provider_method.php.inc +++ /dev/null @@ -1,52 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/keep_string_type_simple.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/keep_string_type_simple.php.inc deleted file mode 100644 index 934ba63e8ec..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/keep_string_type_simple.php.inc +++ /dev/null @@ -1,54 +0,0 @@ - ------ -> - */ - public static function provideData(): \Iterator - { - $anotherTypeObjectType = new ObjectType(AnotherType::class); - yield [__DIR__ . '/Fixture/new_class.php.inc', 1, $anotherTypeObjectType]; - yield [__DIR__ . '/Fixture/argument_typehint.php.inc', 1, $anotherTypeObjectType]; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/multi_objects.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/multi_objects.php.inc deleted file mode 100644 index 8143dbd0569..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/multi_objects.php.inc +++ /dev/null @@ -1,52 +0,0 @@ - ------ ->> - */ - public static function provideData(): iterable - { - yield [[new DateTime(), 'format']]; - yield [[new DateTimeImmutable(), 'format']]; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/nested_array_is_mixed.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/nested_array_is_mixed.php.inc deleted file mode 100644 index d2a686dd973..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/nested_array_is_mixed.php.inc +++ /dev/null @@ -1,48 +0,0 @@ - ------ ->> - */ - public static function provideData(): \Generator - { - yield [[]]; - yield [[1, 2, 3, 4]]; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_array_return.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_array_return.php.inc deleted file mode 100644 index 3dbab25317e..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_array_return.php.inc +++ /dev/null @@ -1,55 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed.php.inc deleted file mode 100644 index d01d18109d6..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed.php.inc +++ /dev/null @@ -1,55 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc deleted file mode 100644 index f40c5d067d2..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/override_dummy_mixed_array.php.inc +++ /dev/null @@ -1,55 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/skip_already_set_type.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/skip_already_set_type.php.inc deleted file mode 100644 index b20ce59e523..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/skip_already_set_type.php.inc +++ /dev/null @@ -1,37 +0,0 @@ -> - */ - public static function provideData(): \Generator - { - yield ['data1', 'data2']; - yield ['item4', 'item5']; - } - - #[DataProvider('provideDataNext')] - public function testSomethingElse() - { - } - - /** - * @return \Iterator> - */ - public static function provideDataNext(): \Iterator - { - yield ['data1', 'data2']; - yield ['item4', 'item5']; - } -} diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/union_same_array_type.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/union_same_array_type.php.inc deleted file mode 100644 index 68a3c43e204..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/union_same_array_type.php.inc +++ /dev/null @@ -1,60 +0,0 @@ - ------ -> - */ - public static function provideData(): \Iterator - { - yield ['...', __DIR__ . '/Source/expected/expected.txt']; - yield ["-old\n+new", __DIR__ . '/Source/expected/expected_old_new.txt']; - - yield [ - FileSystem::read('...'), - __DIR__ . '/Fixture/expected_with_full_diff_by_phpunit.diff', - ]; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/with_integers.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/with_integers.php.inc deleted file mode 100644 index 59e2e5f1553..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/with_integers.php.inc +++ /dev/null @@ -1,52 +0,0 @@ - ------ - diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider.php.inc deleted file mode 100644 index 63e5009eb56..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider.php.inc +++ /dev/null @@ -1,48 +0,0 @@ - ------ -> - */ - public static function provideData() - { - yield ['data1', 'data2']; - yield ['item4', 'item5']; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider_iterable.php.inc b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider_iterable.php.inc deleted file mode 100644 index 159e6398e97..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/Fixture/yield_provider_iterable.php.inc +++ /dev/null @@ -1,66 +0,0 @@ - [1, 2], - 'two' => ['three'], - ], - ]; - yield [ - [ - 'four' => 'five', - ], - ]; - } -} - -?> ------ ->, mixed>> - */ - public static function provideData() - { - yield [ - [ - 'one' => [1, 2], - 'two' => ['three'], - ], - ]; - yield [ - [ - 'four' => 'five', - ], - ]; - } -} - -?> diff --git a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/config/configured_rule.php b/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/config/configured_rule.php deleted file mode 100644 index 60e43dbe171..00000000000 --- a/rules-tests/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector/config/configured_rule.php +++ /dev/null @@ -1,10 +0,0 @@ -rule(AddReturnDocblockDataProviderRector::class); -}; diff --git a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php index 8a5a9e5f6e6..a97d3c89706 100644 --- a/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/ClassMethod/AddParamArrayDocblockFromDataProviderRector.php @@ -6,31 +6,17 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\TypeDeclaration\TypeAnalyzer\ParameterTypeFromDataProviderResolver; -use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; -use Rector\TypeDeclarationDocblocks\NodeFinder\DataProviderMethodsFinder; -use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDataProviderRector\AddParamArrayDocblockFromDataProviderRectorTest + * @deprecated This rule is deprecated, as data provider docblock typing is not relevant to code quality. It increases maintenance cost and decreases readability. */ -final class AddParamArrayDocblockFromDataProviderRector extends AbstractRector +final class AddParamArrayDocblockFromDataProviderRector extends AbstractRector implements DeprecatedInterface { - public function __construct( - private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly TestsNodeAnalyzer $testsNodeAnalyzer, - private readonly DataProviderMethodsFinder $dataProviderMethodsFinder, - private readonly ParameterTypeFromDataProviderResolver $parameterTypeFromDataProviderResolver, - private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, - private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator - ) { - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( @@ -94,72 +80,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $this->testsNodeAnalyzer->isInTestClass($node)) { - return null; - } - - $hasChanged = false; - - foreach ($node->getMethods() as $classMethod) { - if ($classMethod->getParams() === []) { - continue; - } - - if (! $this->testsNodeAnalyzer->isTestClassMethod($classMethod)) { - continue; - } - - $dataProviderNodes = $this->dataProviderMethodsFinder->findDataProviderNodes($node, $classMethod); - if ($dataProviderNodes->getClassMethods() === []) { - continue; - } - - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - - foreach ($classMethod->getParams() as $paramPosition => $param) { - // we are interested only in array params - if (! $param->type instanceof Node) { - continue; - } - - if (! $this->isNames($param->type, ['array', 'iterable'])) { - continue; - } - - $paramName = $this->getName($param); - $paramTagValueNode = $phpDocInfo->getParamTagValueByName($paramName); - - // already defined, lets skip it - if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($paramTagValueNode)) { - continue; - } - - $parameterType = $this->parameterTypeFromDataProviderResolver->resolve( - $paramPosition, - $dataProviderNodes->getClassMethods() - ); - - $hasParamTypeChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableParamType( - $parameterType, - $phpDocInfo, - $classMethod, - $param, - $paramName - ); - - if (! $hasParamTypeChanged) { - continue; - } - - $hasChanged = true; - } - - } - - if (! $hasChanged) { - return null; - } - - return $node; + throw new ShouldNotHappenException(sprintf( + '"%s" is deprecated, as data provider docblock typing is not relevant to code quality', + self::class + )); } } diff --git a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php index 007b9c971ef..50d6d35f017 100644 --- a/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php +++ b/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php @@ -5,39 +5,18 @@ namespace Rector\TypeDeclarationDocblocks\Rector\Class_; use PhpParser\Node; -use PhpParser\Node\Expr; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\Return_; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedGenericObjectType; -use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator; -use Rector\TypeDeclarationDocblocks\NodeFinder\DataProviderMethodsFinder; -use Rector\TypeDeclarationDocblocks\NodeFinder\ReturnNodeFinder; -use Rector\TypeDeclarationDocblocks\NodeFinder\YieldNodeFinder; -use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer; -use Rector\TypeDeclarationDocblocks\TypeResolver\YieldTypeResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\AddReturnDocblockDataProviderRector\AddReturnDocblockDataProviderRectorTest + * @deprecated This rule is deprecated, as data provider docblock typing is not relevant to code quality. It increases maintenance cost and decreases readability. */ -final class AddReturnDocblockDataProviderRector extends AbstractRector +final class AddReturnDocblockDataProviderRector extends AbstractRector implements DeprecatedInterface { - public function __construct( - private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly TestsNodeAnalyzer $testsNodeAnalyzer, - private readonly DataProviderMethodsFinder $dataProviderMethodsFinder, - private readonly ReturnNodeFinder $returnNodeFinder, - private readonly YieldTypeResolver $yieldTypeResolver, - private readonly YieldNodeFinder $yieldNodeFinder, - private readonly UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, - private readonly NodeDocblockTypeDecorator $nodeDocblockTypeDecorator, - ) { - } - public function getNodeTypes(): array { return [Class_::class]; @@ -102,78 +81,9 @@ public function provideItems() */ public function refactor(Node $node): ?Node { - if (! $this->testsNodeAnalyzer->isInTestClass($node)) { - return null; - } - - $hasChanged = false; - - $dataProviderClassMethods = $this->dataProviderMethodsFinder->findDataProviderNodesInClass($node); - if ($dataProviderClassMethods === []) { - return null; - } - - foreach ($dataProviderClassMethods as $dataProviderClassMethod) { - $classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($dataProviderClassMethod); - - $returnTagValueNode = $classMethodPhpDocInfo->getReturnTagValue(); - - // already set - if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($returnTagValueNode)) { - continue; - } - - $soleReturn = $this->returnNodeFinder->findOnlyReturnWithExpr($dataProviderClassMethod); - - // unable to resolve type - if ($soleReturn instanceof Return_) { - if (! $soleReturn->expr instanceof Expr) { - continue; - } - - $soleReturnType = $this->getType($soleReturn->expr); - - $hasClassMethodChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableReturnType( - $soleReturnType, - $classMethodPhpDocInfo, - $dataProviderClassMethod - ); - - if (! $hasClassMethodChanged) { - continue; - } - - $hasChanged = true; - continue; - } - - $yields = $this->yieldNodeFinder->find($dataProviderClassMethod); - if ($yields !== []) { - $yieldType = $this->yieldTypeResolver->resolveFromYieldNodes($yields, $dataProviderClassMethod); - - if ($yieldType instanceof FullyQualifiedGenericObjectType && $yieldType->getClassName() === 'Generator' && ! $dataProviderClassMethod->returnType instanceof Node) { - // most likely, a static iterator is used in data test fixtures - $yieldType = new FullyQualifiedGenericObjectType('Iterator', $yieldType->getTypes()); - } - - $hasClassMethodChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableReturnType( - $yieldType, - $classMethodPhpDocInfo, - $dataProviderClassMethod - ); - - if (! $hasClassMethodChanged) { - continue; - } - - $hasChanged = true; - } - } - - if (! $hasChanged) { - return null; - } - - return $node; + throw new ShouldNotHappenException(sprintf( + '"%s" is deprecated, as data provider docblock typing is not relevant to code quality', + self::class + )); } } diff --git a/src/Config/Level/TypeDeclarationDocblocksLevel.php b/src/Config/Level/TypeDeclarationDocblocksLevel.php index 06f732c52cf..f03ccfd4d94 100644 --- a/src/Config/Level/TypeDeclarationDocblocksLevel.php +++ b/src/Config/Level/TypeDeclarationDocblocksLevel.php @@ -8,7 +8,6 @@ use Rector\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector; use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnArrayDocblockBasedOnArrayMapRector; use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnDocblockForScalarArrayFromAssignsRector; -use Rector\TypeDeclarationDocblocks\Rector\Class_\AddReturnDocblockDataProviderRector; use Rector\TypeDeclarationDocblocks\Rector\Class_\AddVarArrayDocblockFromDimFetchAssignRector; use Rector\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector; use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarArrayFromGetterReturnRector; @@ -16,7 +15,6 @@ use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarFromParamDocblockInConstructorRector; use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockBasedOnArrayMapRector; use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromAssignsParamToParamReferenceRector; -use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDataProviderRector; use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector; use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddReturnDocblockForArrayDimAssignedObjectRector; use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddReturnDocblockForCommonObjectDenominatorRector; @@ -36,10 +34,6 @@ final class TypeDeclarationDocblocksLevel // property var DocblockVarArrayFromPropertyDefaultsRector::class, - // tests - AddParamArrayDocblockFromDataProviderRector::class, - AddReturnDocblockDataProviderRector::class, - // param AddParamArrayDocblockFromDimFetchAccessRector::class, ClassMethodArrayDocblockParamFromLocalCallsRector::class,