3636final class DependencyResolver
3737{
3838
39- /** @var array<string, true > */
40- private array $ seenClasses = [];
39+ /** @var array<string, list<ClassReflection|FunctionReflection > */
40+ private array $ classDependencies = [];
4141
4242 public function __construct (
4343 private FileHelper $ fileHelper ,
@@ -522,36 +522,43 @@ private function considerArrayForCallableTest(Scope $scope, Array_ $arrayNode):
522522 * @param array<int, ClassReflection|FunctionReflection> $dependenciesReflections
523523 */
524524 private function addClassToDependencies (string $ className , array &$ dependenciesReflections ): void
525+ {
526+ if (!array_key_exists ($ className , $ this ->classDependencies )) {
527+ $ this ->classDependencies [$ className ] = $ this ->buildClassToDependencies ($ className );
528+ }
529+
530+ $ dependenciesReflections = array_merge ($ dependenciesReflections , $ this ->classDependencies [$ className ]);
531+ }
532+
533+ /**
534+ * @return list<int, ClassReflection|FunctionReflection>
535+ */
536+ private function buildClassToDependencies (string $ className ): array
525537 {
526538 try {
527539 $ classReflection = $ this ->reflectionProvider ->getClass ($ className );
528540 } catch (ClassNotFoundException ) {
529- return ;
530- }
531-
532- $ cacheKey = spl_object_id ($ classReflection );
533- if (isset ($ this ->seenClasses [$ cacheKey ])) {
534- return ;
541+ return [];
535542 }
536- $ this ->seenClasses [$ cacheKey ] = true ;
537543
544+ $ dependencies = [];
538545 do {
539- $ dependenciesReflections [] = $ classReflection ;
546+ $ dependencies [] = $ classReflection ;
540547
541548 foreach ($ classReflection ->getInterfaces () as $ interface ) {
542- $ dependenciesReflections [] = $ interface ;
549+ $ dependencies [] = $ interface ;
543550 }
544551
545552 foreach ($ classReflection ->getTraits (true ) as $ trait ) {
546- $ dependenciesReflections [] = $ trait ;
553+ $ dependencies [] = $ trait ;
547554 }
548555
549556 foreach ($ classReflection ->getResolvedMixinTypes () as $ mixinType ) {
550557 foreach ($ mixinType ->getReferencedClasses () as $ referencedClass ) {
551558 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
552559 continue ;
553560 }
554- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
561+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
555562 }
556563 }
557564
@@ -560,7 +567,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
560567 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
561568 continue ;
562569 }
563- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
570+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
564571 }
565572 }
566573
@@ -569,7 +576,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
569576 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
570577 continue ;
571578 }
572- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
579+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
573580 }
574581 }
575582
@@ -578,7 +585,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
578585 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
579586 continue ;
580587 }
581- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
588+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
582589 }
583590
584591 $ default = $ templateTag ->getDefault ();
@@ -589,7 +596,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
589596 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
590597 continue ;
591598 }
592- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
599+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
593600 }
594601 }
595602
@@ -599,7 +606,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
599606 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
600607 continue ;
601608 }
602- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
609+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
603610 }
604611 }
605612
@@ -611,7 +618,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
611618 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
612619 continue ;
613620 }
614- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
621+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
615622 }
616623 }
617624
@@ -620,14 +627,14 @@ private function addClassToDependencies(string $className, array &$dependenciesR
620627 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
621628 continue ;
622629 }
623- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
630+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
624631 }
625632 foreach ($ methodTag ->getParameters () as $ parameter ) {
626633 foreach ($ parameter ->getType ()->getReferencedClasses () as $ referencedClass ) {
627634 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
628635 continue ;
629636 }
630- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
637+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
631638 }
632639 if ($ parameter ->getDefaultValue () === null ) {
633640 continue ;
@@ -636,7 +643,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
636643 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
637644 continue ;
638645 }
639- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
646+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
640647 }
641648 }
642649 }
@@ -646,7 +653,7 @@ private function addClassToDependencies(string $className, array &$dependenciesR
646653 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
647654 continue ;
648655 }
649- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
656+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
650657 }
651658 }
652659
@@ -655,19 +662,21 @@ private function addClassToDependencies(string $className, array &$dependenciesR
655662 if (!$ this ->reflectionProvider ->hasClass ($ referencedClass )) {
656663 continue ;
657664 }
658- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
665+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ referencedClass );
659666 }
660667 }
661668
662669 $ phpDoc = $ classReflection ->getResolvedPhpDoc ();
663670 if ($ phpDoc !== null ) {
664671 foreach ($ phpDoc ->getTypeAliasImportTags () as $ importTag ) {
665- $ dependenciesReflections [] = $ this ->reflectionProvider ->getClass ($ importTag ->getImportedFrom ());
672+ $ dependencies [] = $ this ->reflectionProvider ->getClass ($ importTag ->getImportedFrom ());
666673 }
667674 }
668675
669676 $ classReflection = $ classReflection ->getParentClass ();
670677 } while ($ classReflection !== null );
678+
679+ return $ dependencies ;
671680 }
672681
673682 private function getFunctionReflection (Node \Name $ nameNode , ?Scope $ scope ): FunctionReflection
0 commit comments