diff --git a/packages/node-type-resolver/src/NodeTypeResolver.php b/packages/node-type-resolver/src/NodeTypeResolver.php index f47378d5b362..c1e2489f5f5e 100644 --- a/packages/node-type-resolver/src/NodeTypeResolver.php +++ b/packages/node-type-resolver/src/NodeTypeResolver.php @@ -158,10 +158,6 @@ public function isObjectType(Node $node, $requiredType): bool return true; } - if ($this->isUnionNullTypeOfRequiredType($requiredType, $resolvedType)) { - return true; - } - return $this->isMatchingUnionType($requiredType, $resolvedType); } @@ -180,7 +176,7 @@ public function resolve(Node $node): Type */ public function isNullableType(Node $node): bool { - $nodeType = $this->getStaticType($node); + $nodeType = $this->resolve($node); if (! $nodeType instanceof UnionType) { return false; } @@ -231,7 +227,8 @@ public function getStaticType(Node $node): Type public function isNullableObjectType(Node $node): bool { - $nodeType = $this->getStaticType($node); + $nodeType = $this->resolve($node); + if (! $nodeType instanceof UnionType) { return false; } @@ -269,7 +266,7 @@ public function isStaticType(Node $node, string $staticTypeClass): bool )); } - return is_a($this->getStaticType($node), $staticTypeClass); + return is_a($this->resolve($node), $staticTypeClass); } private function addPerNodeTypeResolver(PerNodeTypeResolverInterface $perNodeTypeResolver): void @@ -315,34 +312,6 @@ private function isFnMatch(Node $node, string $requiredType): bool return false; } - /** - * Matches: - * - Type|null - */ - private function isUnionNullTypeOfRequiredType(ObjectType $objectType, Type $resolvedType): bool - { - if (! $resolvedType instanceof UnionType) { - return false; - } - - if (count($resolvedType->getTypes()) !== 2) { - return false; - } - - $firstType = $resolvedType->getTypes()[0]; - $secondType = $resolvedType->getTypes()[1]; - - if ($firstType instanceof NullType && $secondType instanceof ObjectType) { - return $objectType->equals($firstType); - } - - if ($secondType instanceof NullType && $firstType instanceof ObjectType) { - return $objectType->equals($secondType); - } - - return false; - } - private function resolveFirstType(Node $node): Type { foreach ($this->perNodeTypeResolvers as $perNodeTypeResolver) { @@ -434,7 +403,7 @@ private function isAnonymousClass(Node $node): bool private function getVendorPropertyFetchType(PropertyFetch $propertyFetch): ?Type { - $varObjectType = $this->getStaticType($propertyFetch->var); + $varObjectType = $this->resolve($propertyFetch->var); if (! $varObjectType instanceof TypeWithClassName) { return null; } @@ -490,10 +459,12 @@ private function isMatchingUnionType(Type $requiredType, Type $resolvedType): bo if (! $resolvedType instanceof UnionType) { return false; } + foreach ($resolvedType->getTypes() as $unionedType) { if (! $unionedType->equals($requiredType)) { continue; } + return true; }