Skip to content

Commit ea2ebe1

Browse files
committed
Update DependencyResolver.php
1 parent 0427216 commit ea2ebe1

1 file changed

Lines changed: 34 additions & 25 deletions

File tree

src/Dependency/DependencyResolver.php

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
final 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

Comments
 (0)