diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_clone.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_clone.php.inc new file mode 100644 index 00000000000..b8aaca18b6b --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_clone.php.inc @@ -0,0 +1,35 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_construct.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_construct.php.inc new file mode 100644 index 00000000000..1cc072c192c --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_construct.php.inc @@ -0,0 +1,30 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_destruct.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_destruct.php.inc new file mode 100644 index 00000000000..f3585f36c43 --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/Fixture/remove_return_destruct.php.inc @@ -0,0 +1,30 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/RemoveVoidDocblockFromMagicMethodRectorTest.php b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/RemoveVoidDocblockFromMagicMethodRectorTest.php new file mode 100644 index 00000000000..55965fa2cbe --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/RemoveVoidDocblockFromMagicMethodRectorTest.php @@ -0,0 +1,28 @@ +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/RemoveVoidDocblockFromMagicMethodRector/config/configured_rule.php b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/config/configured_rule.php new file mode 100644 index 00000000000..8aeda0cf9a1 --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector/config/configured_rule.php @@ -0,0 +1,9 @@ +withRules([RemoveVoidDocblockFromMagicMethodRector::class]); diff --git a/rules/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector.php b/rules/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector.php new file mode 100644 index 00000000000..30b88b28329 --- /dev/null +++ b/rules/DeadCode/Rector/ClassMethod/RemoveVoidDocblockFromMagicMethodRector.php @@ -0,0 +1,108 @@ +returnType instanceof Node) { + return null; + } + + if (! $this->isNames($node, [MethodName::CONSTRUCT, MethodName::DESTRUCT, MethodName::CLONE])) { + return null; + } + + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + + $returnTagValueNode = $phpDocInfo->getReturnTagValue(); + if (! $returnTagValueNode instanceof ReturnTagValueNode) { + return null; + } + + if ($returnTagValueNode->description !== '') { + return null; + } + + if (! $returnTagValueNode->type instanceof IdentifierTypeNode || $returnTagValueNode->type->name !== 'void') { + return null; + } + + $phpDocInfo->removeByType(ReturnTagValueNode::class); + + $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); + return $node; + } +} diff --git a/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php b/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php index 87456f68511..5240e01f930 100644 --- a/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php +++ b/rules/DeadCode/Rector/If_/RemoveDeadIfBlockRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Stmt\Else_; +use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\If_; use PhpParser\NodeVisitor; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; @@ -100,16 +101,16 @@ public function refactor(Node $node): int|null|If_ return $this->refactor($node) ?? $node; } - if ($node->elseifs !== []) { - foreach ($node->elseifs as $elseif) { - $keep_elseifs = array_filter( - $node->elseifs, - fn ($elseif) => $elseif->stmts !== [] || $this->sideEffectNodeDetector->detect($elseif->cond) - ); - if (count($node->elseifs) !== count($keep_elseifs)) { - $node->elseifs = $keep_elseifs; - return $this->refactor($node) ?? $node; - } + foreach ($node->elseifs as $elseif) { + $keep_elseifs = array_filter( + $node->elseifs, + fn (ElseIf_ $elseif): bool => $elseif->stmts !== [] || $this->sideEffectNodeDetector->detect( + $elseif->cond + ) + ); + if (count($node->elseifs) !== count($keep_elseifs)) { + $node->elseifs = $keep_elseifs; + return $this->refactor($node) ?? $node; } } @@ -141,6 +142,7 @@ public function refactor(Node $node): int|null|If_ if (count($node->elseifs) > 1) { $if->elseifs = \array_slice($node->elseifs, 1); } + return $this->refactor($if) ?? $if; } diff --git a/src/Config/Level/DeadCodeLevel.php b/src/Config/Level/DeadCodeLevel.php index a9f41f9e398..e59264dae1a 100644 --- a/src/Config/Level/DeadCodeLevel.php +++ b/src/Config/Level/DeadCodeLevel.php @@ -27,6 +27,7 @@ use Rector\DeadCode\Rector\ClassMethod\RemoveUselessParamTagRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnExprInConstructRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnTagRector; +use Rector\DeadCode\Rector\ClassMethod\RemoveVoidDocblockFromMagicMethodRector; use Rector\DeadCode\Rector\Closure\RemoveUnusedClosureVariableUseRector; use Rector\DeadCode\Rector\Concat\RemoveConcatAutocastRector; use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector; @@ -109,6 +110,7 @@ final class DeadCodeLevel RemoveDeadZeroAndOneOperationRector::class, // docblock + RemoveVoidDocblockFromMagicMethodRector::class, RemoveUselessParamTagRector::class, RemoveUselessReturnTagRector::class, RemoveUselessReadOnlyTagRector::class, diff --git a/src/PhpParser/Node/BetterNodeFinder.php b/src/PhpParser/Node/BetterNodeFinder.php index 631c06763bf..a69e404fb79 100644 --- a/src/PhpParser/Node/BetterNodeFinder.php +++ b/src/PhpParser/Node/BetterNodeFinder.php @@ -4,7 +4,6 @@ namespace Rector\PhpParser\Node; -use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Expr\Yield_; @@ -12,6 +11,7 @@ use PhpParser\Node\FunctionLike; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; +use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PhpParser\NodeFinder; use PhpParser\NodeVisitor;