From b2890cd3f7f699331f845b98ae773456dc8595d3 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 11 Oct 2026 19:40:45 +0200 Subject: [PATCH] [DeadCode] Deprecate RemoveDuplicatedReturnSelfDocblockRector --- ...ove_return_current_object_docblock.php.inc | 30 ------ .../remove_return_self_docblock.php.inc | 30 ------ .../remove_return_static_docblock.php.inc | 32 ------ .../remove_return_this_docblock.php.inc | 30 ------ .../Fixture/skip_generic_return_self.php.inc | 18 ---- .../skip_generic_union_return_self.php.inc | 17 ---- .../Fixture/skip_other_type.php.inc | 14 --- ...DuplicatedReturnSelfDocblockRectorTest.php | 28 ------ .../config/configured_rule.php | 9 -- ...moveDuplicatedReturnSelfDocblockRector.php | 99 ++----------------- src/Config/Level/DeadCodeLevel.php | 2 - 11 files changed, 8 insertions(+), 301 deletions(-) delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_current_object_docblock.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_self_docblock.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_static_docblock.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_this_docblock.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_return_self.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_union_return_self.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_other_type.php.inc delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/RemoveDuplicatedReturnSelfDocblockRectorTest.php delete mode 100644 rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/config/configured_rule.php diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_current_object_docblock.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_current_object_docblock.php.inc deleted file mode 100644 index 541ff7767aa..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_current_object_docblock.php.inc +++ /dev/null @@ -1,30 +0,0 @@ - ------ - diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_self_docblock.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_self_docblock.php.inc deleted file mode 100644 index 9d1763c72cb..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_self_docblock.php.inc +++ /dev/null @@ -1,30 +0,0 @@ - ------ - diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_static_docblock.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_static_docblock.php.inc deleted file mode 100644 index a2e0b980dae..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_static_docblock.php.inc +++ /dev/null @@ -1,32 +0,0 @@ - ------ - diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_this_docblock.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_this_docblock.php.inc deleted file mode 100644 index 53578dc5101..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/remove_return_this_docblock.php.inc +++ /dev/null @@ -1,30 +0,0 @@ - ------ - diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_return_self.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_return_self.php.inc deleted file mode 100644 index 952bcaabf0b..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_return_self.php.inc +++ /dev/null @@ -1,18 +0,0 @@ - - */ - public function success(): self - { - return $this; - } -} diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_union_return_self.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_union_return_self.php.inc deleted file mode 100644 index 4fe32cf9b2b..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_generic_union_return_self.php.inc +++ /dev/null @@ -1,17 +0,0 @@ - - */ - public function get(): self - { - return $this; - } -} diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_other_type.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_other_type.php.inc deleted file mode 100644 index 75365f17a8c..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/Fixture/skip_other_type.php.inc +++ /dev/null @@ -1,14 +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/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/config/configured_rule.php deleted file mode 100644 index fbd77ab370a..00000000000 --- a/rules-tests/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([RemoveDuplicatedReturnSelfDocblockRector::class]); diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector.php index ce857108361..ee808c5078d 100644 --- a/rules/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector.php +++ b/rules/DeadCode/Rector/ClassMethod/RemoveDuplicatedReturnSelfDocblockRector.php @@ -4,40 +4,19 @@ namespace Rector\DeadCode\Rector\ClassMethod; -use PhpParser\Comment\Doc; use PhpParser\Node; -use PhpParser\Node\Identifier; -use PhpParser\Node\Name; use PhpParser\Node\Stmt\ClassMethod; -use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; -use PHPStan\PhpDocParser\Ast\Type\TypeNode; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Type\Generic\GenericObjectType; -use PHPStan\Type\Generic\GenericStaticType; -use PHPStan\Type\ObjectType; -use PHPStan\Type\StaticType; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; -use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\Reflection\ReflectionResolver; use Rector\RuleDoc\CodeSample\CodeSample; use Rector\RuleDoc\RuleDefinition; -use Rector\StaticTypeMapper\StaticTypeMapper; /** - * @see \Rector\Tests\DeadCode\Rector\ClassMethod\RemoveDuplicatedReturnSelfDocblockRector\RemoveDuplicatedReturnSelfDocblockRectorTest + * @deprecated This rule is deprecated, as removing a duplicated @return self/static docblock is tricky and sometimes intentional. Handle it with static analysis and full context instead. */ -final class RemoveDuplicatedReturnSelfDocblockRector extends AbstractRector +final class RemoveDuplicatedReturnSelfDocblockRector extends AbstractRector implements DeprecatedInterface { - public function __construct( - private readonly PhpDocInfoFactory $phpDocInfoFactory, - private readonly DocBlockUpdater $docBlockUpdater, - private readonly StaticTypeMapper $staticTypeMapper, - private readonly ReflectionResolver $reflectionResolver, - ) { - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( @@ -84,71 +63,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $node->returnType instanceof Identifier && ! $node->returnType instanceof Name) { - return null; - } - - $returnTypeName = $node->returnType->toString(); - if (! in_array($returnTypeName, ['self', 'static'], true)) { - return null; - } - - // a duplicated @return tag can only live in a docblock; skip before resolving reflection - if (!$node->getDocComment() instanceof Doc) { - return null; - } - - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - if (! $classReflection instanceof ClassReflection) { - return null; - } - - $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); - if (! $phpDocInfo instanceof PhpDocInfo) { - return null; - } - - $returnTagValueNode = $phpDocInfo->getReturnTagValue(); - if (! $returnTagValueNode instanceof ReturnTagValueNode) { - return null; - } - - if ($returnTagValueNode->description !== '') { - return null; - } - - if (! $this->isCurrentObjectReturnDocType($returnTagValueNode->type, $node, $classReflection)) { - return null; - } - - $phpDocInfo->removeByType(ReturnTagValueNode::class); - $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); - - return $node; - } - - private function isCurrentObjectReturnDocType( - TypeNode $typeNode, - ClassMethod $classMethod, - ClassReflection $classReflection - ): bool { - $docType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($typeNode, $classMethod); - - // generic narrowing, e.g. @return self is not a plain duplicate of the native self type - if ($docType instanceof GenericObjectType || $docType instanceof GenericStaticType) { - return false; - } - - // covers @return $this and @return static - if ($docType instanceof StaticType) { - return $docType->getClassName() === $classReflection->getName(); - } - - // covers @return self and @return CurrentObject - if ($docType instanceof ObjectType) { - return $docType->getClassName() === $classReflection->getName(); - } - - return false; + throw new ShouldNotHappenException(sprintf( + '"%s" rule is deprecated, as removing a duplicated @return self/static docblock is tricky and sometimes intentional', + self::class + )); } } diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index 4486a9f3b8a..7c1350fd99a 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -20,7 +20,6 @@ use Rector\DeadCode\Rector\Cast\RecastingRemovalRector; use Rector\DeadCode\Rector\ClassConst\RemoveUnusedPrivateClassConstantRector; use Rector\DeadCode\Rector\ClassMethod\RemoveArgumentFromDefaultParentCallRector; -use Rector\DeadCode\Rector\ClassMethod\RemoveDuplicatedReturnSelfDocblockRector; use Rector\DeadCode\Rector\ClassMethod\RemoveEmptyClassMethodRector; use Rector\DeadCode\Rector\ClassMethod\RemoveMixedDocblockOverruledByNativeTypeRector; use Rector\DeadCode\Rector\ClassMethod\RemoveNullTagValueNodeRector; @@ -138,7 +137,6 @@ final class DeadCodeLevel RemoveVoidDocblockFromMagicMethodRector::class, RemoveUselessParamTagRector::class, RemoveUselessReturnTagRector::class, - RemoveDuplicatedReturnSelfDocblockRector::class, RemoveMixedDocblockOverruledByNativeTypeRector::class, RemoveReturnTagIncompatibleWithNativeTypeRector::class, RemoveUselessUnionReturnDocblockRector::class,