From fffe49e4aac9a15492d4ba36cb4c5aae8a47a3d0 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Sun, 10 Dec 2023 16:32:52 +0000 Subject: [PATCH] Updated Rector to commit 287eab3a7040f8d42fa10701d5fbfc2998fdcc25 https://github.com/rectorphp/rector-src/commit/287eab3a7040f8d42fa10701d5fbfc2998fdcc25 [DeadCode] Add RemoveNullTagValueNodeRector (#5352) --- docs/rector_rules_overview.md | 25 ++- .../RemoveNullTagValueNodeRector.php | 150 ++++++++++++++++++ src/Application/VersionResolver.php | 4 +- vendor/composer/autoload_classmap.php | 1 + vendor/composer/autoload_static.php | 1 + 5 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php diff --git a/docs/rector_rules_overview.md b/docs/rector_rules_overview.md index e41ae0f3965..b8550568d8e 100644 --- a/docs/rector_rules_overview.md +++ b/docs/rector_rules_overview.md @@ -1,4 +1,4 @@ -# 352 Rules Overview +# 353 Rules Overview
@@ -10,7 +10,7 @@ - [CodingStyle](#codingstyle) (27) -- [DeadCode](#deadcode) (42) +- [DeadCode](#deadcode) (43) - [EarlyReturn](#earlyreturn) (9) @@ -2509,6 +2509,27 @@ Remove initialization with null value from property declarations
+### RemoveNullTagValueNodeRector + +Remove `@var/@param/@return` null docblock + +- class: [`Rector\DeadCode\Rector\ClassMethod\RemoveNullTagValueNodeRector`](../rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php) + +```diff + class SomeClass + { +- /** +- * @return null +- */ + public function foo() + { + return null; + } + } +``` + +
+ ### RemoveParentCallWithoutParentRector Remove unused parent call with no parent class diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php new file mode 100644 index 00000000000..2e02b7a1674 --- /dev/null +++ b/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php @@ -0,0 +1,150 @@ +docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove @var/@param/@return null docblock', [new CodeSample(<<<'CODE_SAMPLE' +class SomeClass +{ + /** + * @return null + */ + public function foo() + { + return null; + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + public function foo() + { + return null; + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class, Function_::class, Expression::class, Property::class]; + } + /** + * @param \PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode $tag + */ + private function isNull($tag) : bool + { + return $tag->type instanceof IdentifierTypeNode && $tag->type->__toString() === 'null' && $tag->description === ''; + } + /** + * @param string[] $paramNames + */ + private function removeParamNullTag(PhpDocInfo $phpDocInfo, array $paramNames) : void + { + $phpDocNodeTraverser = new PhpDocNodeTraverser(); + $phpDocNodeTraverser->traverseWithCallable($phpDocInfo->getPhpDocNode(), '', static function (AstNode $astNode) use($paramNames) : ?int { + if (!$astNode instanceof PhpDocTagNode) { + return null; + } + if (!$astNode->value instanceof ParamTagValueNode) { + return null; + } + if (\in_array($astNode->value->parameterName, $paramNames, \true)) { + return PhpDocNodeTraverser::NODE_REMOVE; + } + return null; + }); + } + /** + * @param \PhpParser\Node\Stmt\Expression|\PhpParser\Node\Stmt\Property $node + */ + private function processVarTagNull($node) : ?Node + { + $phpdocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $varTagValueNode = $phpdocInfo->getVarTagValueNode(); + if ($varTagValueNode instanceof VarTagValueNode && $this->isNull($varTagValueNode)) { + $phpdocInfo->removeByType(VarTagValueNode::class); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } + return null; + } + /** + * @param ClassMethod|Function_|Expression|Property $node + */ + public function refactor(Node $node) : ?Node + { + if ($node instanceof Expression || $node instanceof Property) { + return $this->processVarTagNull($node); + } + $phpdocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $removedParamNames = []; + foreach ($node->params as $param) { + $paramName = $this->getName($param); + $paramTagValueNode = $phpdocInfo->getParamTagValueByName($paramName); + if ($paramTagValueNode instanceof ParamTagValueNode && $this->isNull($paramTagValueNode)) { + $removedParamNames[] = $paramTagValueNode->parameterName; + } + } + $hasRemoved = \false; + if ($removedParamNames !== []) { + $this->removeParamNullTag($phpdocInfo, $removedParamNames); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + $hasRemoved = \true; + } + $returnTagValueNode = $phpdocInfo->getReturnTagValue(); + if ($returnTagValueNode instanceof ReturnTagValueNode && $this->isNull($returnTagValueNode)) { + $phpdocInfo->removeByType(ReturnTagValueNode::class); + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + $hasRemoved = \true; + } + if (!$hasRemoved) { + return null; + } + return $node; + } +} diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index a74a89c6048..5e0d7b0272d 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = 'f8c3a2e313d5eee15c2aca53177ccf377042a65c'; + public const PACKAGE_VERSION = '287eab3a7040f8d42fa10701d5fbfc2998fdcc25'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-12-10 13:33:42'; + public const RELEASE_DATE = '2023-12-10 17:30:26'; /** * @var int */ diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 4947bb00b9d..ec726d74f34 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -1332,6 +1332,7 @@ return array( 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => $baseDir . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => $baseDir . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodParameterRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index e8764f5ad3d..a00f5ff84d9 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -1550,6 +1550,7 @@ class ComposerStaticInita55c41c7fa52abd86138c6f32df1d185 'Rector\\DeadCode\\Rector\\ClassConst\\RemoveUnusedPrivateClassConstantRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassConst/RemoveUnusedPrivateClassConstantRector.php', 'Rector\\DeadCode\\Rector\\ClassLike\\RemoveAnnotationRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveEmptyClassMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveNullTagValueNodeRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveNullTagValueNodeRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedConstructorParamRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedConstructorParamRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodParameterRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php',