From 086843a11b4633848546a144c3d4eede0f8ed9ee Mon Sep 17 00:00:00 2001 From: Marcin Czarnecki Date: Sun, 2 Feb 2025 01:51:14 +0100 Subject: [PATCH] Do not typehint DNF union types --- phpcs.xml.dist | 4 ++ src/Metadata/Driver/TypedPropertiesDriver.php | 10 ++- .../TypedProperties/NotSupportedDNFTypes.php | 71 +++++++++++++++++++ .../Driver/UnionTypedPropertiesDriverTest.php | 11 +++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tests/Fixtures/TypedProperties/NotSupportedDNFTypes.php diff --git a/phpcs.xml.dist b/phpcs.xml.dist index e2ed35f0c..ceec7fbe5 100644 --- a/phpcs.xml.dist +++ b/phpcs.xml.dist @@ -107,6 +107,10 @@ tests/* + + tests/Fixtures/TypedProperties/NotSupportedDNFTypes.php + + diff --git a/src/Metadata/Driver/TypedPropertiesDriver.php b/src/Metadata/Driver/TypedPropertiesDriver.php index 5c447a946..eff62b294 100644 --- a/src/Metadata/Driver/TypedPropertiesDriver.php +++ b/src/Metadata/Driver/TypedPropertiesDriver.php @@ -180,7 +180,15 @@ private function shouldTypeHintUnion(?ReflectionType $reflectionType) return false; } - foreach ($reflectionType->getTypes() as $type) { + $types = $reflectionType->getTypes(); + + foreach ($types as $type) { + if ($type instanceof \ReflectionIntersectionType) { + return false; + } + } + + foreach ($types as $type) { if ($this->shouldTypeHintInsideUnion($type)) { return true; } diff --git a/tests/Fixtures/TypedProperties/NotSupportedDNFTypes.php b/tests/Fixtures/TypedProperties/NotSupportedDNFTypes.php new file mode 100644 index 000000000..382c5e5fa --- /dev/null +++ b/tests/Fixtures/TypedProperties/NotSupportedDNFTypes.php @@ -0,0 +1,71 @@ +resolve(NotSupportedDNFTypes::class); + + self::assertCount(10, $m->propertyMetadata); + foreach ($m->propertyMetadata as $propertyMetadata) { + self::assertNull($propertyMetadata->type, 'Breaking Change: TypeResolved for: ' . $propertyMetadata->name); + } + } + private function resolve(string $classToResolve): ClassMetadata { $namingStrategy = new IdenticalPropertyNamingStrategy();