diff --git a/src/Reflection/Adapter/ReflectionEnum.php b/src/Reflection/Adapter/ReflectionEnum.php index c02a88555..131aa5588 100644 --- a/src/Reflection/Adapter/ReflectionEnum.php +++ b/src/Reflection/Adapter/ReflectionEnum.php @@ -18,6 +18,7 @@ use Roave\BetterReflection\Reflection\ReflectionMethod as BetterReflectionMethod; use Roave\BetterReflection\Reflection\ReflectionProperty as BetterReflectionProperty; use Roave\BetterReflection\Util\FileHelper; +use Roave\BetterReflection\Util\Memoize; use ValueError; use function array_combine; @@ -33,9 +34,28 @@ */ final class ReflectionEnum extends CoreReflectionEnum { + /** @var Memoize|list> */ + private Memoize $cases; + public function __construct(private BetterReflectionEnum $betterReflectionEnum) { unset($this->name); + + $this->cases = new Memoize(function () { + $isBacked = $this->betterReflectionEnum->isBacked(); + $cases = $this->betterReflectionEnum->getCases(); + + $mappedCases = []; + foreach ($cases as $case) { + if ($isBacked) { + $mappedCases[] = new ReflectionEnumBackedCase($case); + } else { + $mappedCases[] = new ReflectionEnumUnitCase($case); + } + } + + return $mappedCases; + }); } /** @return non-empty-string */ @@ -527,17 +547,10 @@ public function getCase(string $name): ReflectionEnumUnitCase|ReflectionEnumBack return new ReflectionEnumUnitCase($case); } - /** @return list */ + /** @return list|list */ public function getCases(): array { - /** @psalm-suppress ImpureFunctionCall */ - return array_map(function (BetterReflectionEnumCase $case): ReflectionEnumUnitCase|ReflectionEnumBackedCase { - if ($this->betterReflectionEnum->isBacked()) { - return new ReflectionEnumBackedCase($case); - } - - return new ReflectionEnumUnitCase($case); - }, array_values($this->betterReflectionEnum->getCases())); + return $this->cases->get(); } public function isBacked(): bool diff --git a/src/Util/Memoize.php b/src/Util/Memoize.php new file mode 100644 index 000000000..8046a489e --- /dev/null +++ b/src/Util/Memoize.php @@ -0,0 +1,29 @@ +cb) { + $this->cached = ($this->cb)(); + $this->cb = null; + } + + return $this->cached; + } +}