diff --git a/packages/NodeTypeResolver/NodeTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver.php index ae09c036710..d6eb0bc0bd0 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver.php @@ -52,11 +52,6 @@ final class NodeTypeResolver */ private array $nodeTypeResolvers = []; - /** - * @var array - */ - private array $traitExistsCache = []; - /** * @param NodeTypeResolverInterface[] $nodeTypeResolvers */ @@ -341,32 +336,36 @@ private function resolveByNodeTypeResolvers(Node $node): ?Type private function isObjectTypeOfObjectType(ObjectType $resolvedObjectType, ObjectType $requiredObjectType): bool { - if ($resolvedObjectType->getClassName() === $requiredObjectType->getClassName()) { + $requiredClassName = $requiredObjectType->getClassName(); + $resolvedClassName = $resolvedObjectType->getClassName(); + + if ($resolvedClassName === $requiredClassName) { return true; } - if ($resolvedObjectType->isInstanceOf($requiredObjectType->getClassName())->yes()) { + if ($resolvedObjectType->isInstanceOf($requiredClassName)->yes()) { return true; } - if (! $this->reflectionProvider->hasClass($resolvedObjectType->getClassName())) { + if (! $this->reflectionProvider->hasClass($requiredClassName)) { return false; } + $requiredClassReflection = $this->reflectionProvider->getClass($requiredClassName); - $classReflection = $this->reflectionProvider->getClass($resolvedObjectType->getClassName()); - if (! isset($this->traitExistsCache[$classReflection->getName()])) { - $this->traitExistsCache[$classReflection->getName()] = \trait_exists($requiredObjectType->getClassName()); + if (! $this->reflectionProvider->hasClass($resolvedClassName)) { + return false; } + $resolvedClassReflection = $this->reflectionProvider->getClass($resolvedClassName); - if ($this->traitExistsCache[$classReflection->getName()]) { - foreach ($classReflection->getAncestors() as $ancestorClassReflection) { - if ($ancestorClassReflection->hasTraitUse($requiredObjectType->getClassName())) { + if ($requiredClassReflection->isTrait()) { + foreach ($resolvedClassReflection->getAncestors() as $ancestorClassReflection) { + if ($ancestorClassReflection->hasTraitUse($requiredClassName)) { return true; } } } - return $classReflection->isSubclassOf($requiredObjectType->getClassName()); + return $resolvedClassReflection->isSubclassOf($requiredClassName); } private function resolveObjectType(ObjectType $resolvedObjectType, ObjectType $requiredObjectType): bool