diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias.php.inc new file mode 100644 index 00000000000..2874f3fb02b --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias.php.inc @@ -0,0 +1,23 @@ + 'my-key', + 'hash' => 'my-hash', + ]; + } +} diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias_in_union.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias_in_union.php.inc new file mode 100644 index 00000000000..e9332dde4a2 --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_phpstan_type_alias_in_union.php.inc @@ -0,0 +1,17 @@ +isClassTypeAlias($node, $returnTagValueNode)) { + return null; + } + $nativeReturnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($node->returnType); $docReturnType = $phpDocInfo->getReturnType(); @@ -115,4 +123,26 @@ public function refactor(Node $node): ?Node return $node; } + + private function isClassTypeAlias(Node $node, ReturnTagValueNode $returnTagValueNode): bool + { + $scope = $node->getAttribute(AttributeKey::SCOPE); + if (! $scope instanceof Scope || ! $scope->isInClass()) { + return false; + } + + $resolvedPhpDocBlock = $scope->getClassReflection() + ->getResolvedPhpDoc(); + if (! $resolvedPhpDocBlock instanceof ResolvedPhpDocBlock) { + return false; + } + + $typeAliases = $resolvedPhpDocBlock->getTypeAliasTags() + $resolvedPhpDocBlock->getTypeAliasImportTags(); + if ($typeAliases === []) { + return false; + } + + return $returnTagValueNode->type instanceof IdentifierTypeNode + && isset($typeAliases[$returnTagValueNode->type->name]); + } }