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 PhpDocNodeTraverser::STOP_TRAVERSAL; + } + + return null; + }); + + return $hasTypeAliasName; } private function isReturnTemplate(PhpDocInfo $phpDocInfo, ReturnTagValueNode $returnTagValueNode): bool diff --git a/scripts/src/Finder/RectorClassFinder.php b/scripts/src/Finder/RectorClassFinder.php index 3e5740cfe35..ae7a1d7163f 100644 --- a/scripts/src/Finder/RectorClassFinder.php +++ b/scripts/src/Finder/RectorClassFinder.php @@ -21,7 +21,7 @@ public function find(array $dirs): array $robotLoader->acceptFiles = ['*Rector.php']; $robotLoader->addDirectory(...$dirs); - $robotLoader->setTempDirectory(sys_get_temp_dir() . '/rector-rules'); + $robotLoader->setCacheDirectory(sys_get_temp_dir() . '/rector-rules'); $robotLoader->refresh(); /** @var array $rectorClasses */