Skip to content

Commit

Permalink
Remove runtime autoloading from NodeTypeResolver (#3627)
Browse files Browse the repository at this point in the history
* Remove runtime autoloading from NodeTypeResolver

* refactor
  • Loading branch information
staabm committed Apr 20, 2023
1 parent f08216f commit 9f5d6b9
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions packages/NodeTypeResolver/NodeTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,6 @@ final class NodeTypeResolver
*/
private array $nodeTypeResolvers = [];

/**
* @var array<string, bool>
*/
private array $traitExistsCache = [];

/**
* @param NodeTypeResolverInterface[] $nodeTypeResolvers
*/
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 9f5d6b9

Please sign in to comment.