diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/remove_object_return_next_to_type_alias.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/remove_object_return_next_to_type_alias.php.inc new file mode 100644 index 00000000000..0648711a0bb --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/remove_object_return_next_to_type_alias.php.inc @@ -0,0 +1,36 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_union_of_phpstan_type_aliases.php.inc b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_union_of_phpstan_type_aliases.php.inc new file mode 100644 index 00000000000..34e8a924967 --- /dev/null +++ b/rules-tests/DeadCode/Rector/ClassMethod/RemoveReturnTagIncompatibleWithNativeTypeRector/Fixture/skip_union_of_phpstan_type_aliases.php.inc @@ -0,0 +1,13 @@ +type instanceof IdentifierTypeNode - && isset($typeAliases[$returnTagValueNode->type->name]); + return $this->containsTypeAliasName($returnTagValueNode->type, $typeAliases); + } + + /** + * The alias can be nested in a composed type as well, e.g. "ConfigArray|CustomConfig" or "?ConfigArray" + * + * @param array $typeAliases + */ + private function containsTypeAliasName(TypeNode $typeNode, array $typeAliases): bool + { + if ($typeNode instanceof IdentifierTypeNode) { + return isset($typeAliases[$typeNode->name]); + } + + $hasTypeAliasName = false; + + // the traverser visits sub-nodes only, that is why the type node itself is checked above + $phpDocNodeTraverser = new PhpDocNodeTraverser(); + $phpDocNodeTraverser->traverseWithCallable($typeNode, '', static function (AstNode $astNode) use ( + $typeAliases, + &$hasTypeAliasName + ): ?int { + if ($astNode instanceof IdentifierTypeNode && isset($typeAliases[$astNode->name])) { + $hasTypeAliasName = true; + } + + return null; + }); + + return $hasTypeAliasName; } private function isReturnTemplate(PhpDocInfo $phpDocInfo, ReturnTagValueNode $returnTagValueNode): bool