From cc8670d3b75d1f7f948d06e93450fb010c95095b Mon Sep 17 00:00:00 2001 From: Mathias Arlaud Date: Fri, 20 Dec 2024 12:24:04 +0100 Subject: [PATCH] [TypeInfo] Fix PHPDoc resolving of union with mixed --- .../Tests/TypeResolver/StringTypeResolverTest.php | 2 ++ .../TypeInfo/TypeResolver/StringTypeResolver.php | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php index c2c7eb03615e..9320987c6bae 100644 --- a/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php +++ b/src/Symfony/Component/TypeInfo/Tests/TypeResolver/StringTypeResolverTest.php @@ -155,6 +155,8 @@ public static function resolveDataProvider(): iterable // union yield [Type::union(Type::int(), Type::string()), 'int|string']; + yield [Type::mixed(), 'int|mixed']; + yield [Type::mixed(), 'mixed|int']; // intersection yield [Type::intersection(Type::object(\DateTime::class), Type::object(\Stringable::class)), \DateTime::class.'&'.\Stringable::class]; diff --git a/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php b/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php index 15fff64aebb9..a172d388a872 100644 --- a/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php +++ b/src/Symfony/Component/TypeInfo/TypeResolver/StringTypeResolver.php @@ -223,7 +223,19 @@ private function getTypeFromNode(TypeNode $node, ?TypeContext $typeContext): Typ } if ($node instanceof UnionTypeNode) { - return Type::union(...array_map(fn (TypeNode $t): Type => $this->getTypeFromNode($t, $typeContext), $node->types)); + $types = []; + + foreach ($node->types as $nodeType) { + $type = $this->getTypeFromNode($nodeType, $typeContext); + + if ($type instanceof BuiltinType && TypeIdentifier::MIXED === $type->getTypeIdentifier()) { + return Type::mixed(); + } + + $types[] = $type; + } + + return Type::union(...$types); } if ($node instanceof IntersectionTypeNode) {