From 1da22824edd107108e087d40233769817a2cbe25 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 4 Apr 2023 07:52:59 +0700 Subject: [PATCH] [PostRector] Skip remove unused use on used as ConstFetchNode, eg: TypeKind::* (#3560) * [PostRector] Skip remove unused use on used as asterisk * Fixed :tada: * final touch: eol * final touch: rename fixture * rename method --- .../PhpDocInfo/PhpDocInfo.php | 30 +++++++++++++++++++ .../Rector/UnusedImportRemovingPostRector.php | 3 ++ .../skip_used_as_const_fetch_node.php.inc | 15 ++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tests/Issues/NamespacedUse/Fixture/skip_used_as_const_fetch_node.php.inc diff --git a/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php b/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php index 2cce5b47cbe..2d14a291646 100644 --- a/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php +++ b/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php @@ -4,6 +4,7 @@ namespace Rector\BetterPhpDocParser\PhpDocInfo; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Node; use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\MethodTagValueNode; @@ -16,6 +17,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\Type\MixedType; @@ -26,6 +28,7 @@ use Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder; use Rector\BetterPhpDocParser\PhpDocNodeVisitor\ChangedPhpDocNodeVisitor; use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; +use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\Type\ShortenedIdentifierTypeNode; use Rector\ChangesReporting\Collector\RectorChangeCollector; use Rector\Core\Configuration\CurrentNodeProvider; @@ -448,6 +451,33 @@ public function getAnnotationClassNames(): array return $resolvedClasses; } + /** + * @return string[] + */ + public function getConstFetchNodeClassNames(): array + { + $phpDocNodeTraverser = new PhpDocNodeTraverser(); + + $classNames = []; + + $phpDocNodeTraverser->traverseWithCallable($this->phpDocNode, '', static function (Node $node) use ( + &$classNames, + ): ?ConstTypeNode { + if (! $node instanceof ConstTypeNode) { + return null; + } + + if (! $node->constExpr instanceof ConstFetchNode) { + return null; + } + + $classNames[] = $node->constExpr->getAttribute(PhpDocAttributeKey::RESOLVED_CLASS); + return $node; + }); + + return $classNames; + } + private function resolveNameForPhpDocTagValueNode(PhpDocTagValueNode $phpDocTagValueNode): ?string { foreach (self::TAGS_TYPES_TO_NAMES as $tagValueNodeType => $name) { diff --git a/packages/PostRector/Rector/UnusedImportRemovingPostRector.php b/packages/PostRector/Rector/UnusedImportRemovingPostRector.php index 28bf465ca25..8eaee61181f 100644 --- a/packages/PostRector/Rector/UnusedImportRemovingPostRector.php +++ b/packages/PostRector/Rector/UnusedImportRemovingPostRector.php @@ -159,6 +159,9 @@ private function findNamesInDocBlocks(Namespace_|FileWithoutNamespace $namespace $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); $names = array_merge($names, $phpDocInfo->getAnnotationClassNames()); + + $constFetchNodeNames = $phpDocInfo->getConstFetchNodeClassNames(); + $names = array_merge($names, $constFetchNodeNames); }); return $names; diff --git a/tests/Issues/NamespacedUse/Fixture/skip_used_as_const_fetch_node.php.inc b/tests/Issues/NamespacedUse/Fixture/skip_used_as_const_fetch_node.php.inc new file mode 100644 index 00000000000..9ba96216d9d --- /dev/null +++ b/tests/Issues/NamespacedUse/Fixture/skip_used_as_const_fetch_node.php.inc @@ -0,0 +1,15 @@ +