indexed by reflector key and identifier cache key */ private array $cacheByIdentifierKeyAndOid = []; /** @var array> indexed by reflector key and identifier type cache key */ private array $cacheByIdentifierTypeKeyAndOid = []; public function __construct(private SourceLocator $wrappedSourceLocator) { } public function locateIdentifier(Reflector $reflector, Identifier $identifier): Reflection|null { $cacheKey = sprintf('%s_%s', $this->reflectorCacheKey($reflector), $this->identifierToCacheKey($identifier)); if (array_key_exists($cacheKey, $this->cacheByIdentifierKeyAndOid)) { return $this->cacheByIdentifierKeyAndOid[$cacheKey]; } return $this->cacheByIdentifierKeyAndOid[$cacheKey] = $this->wrappedSourceLocator->locateIdentifier($reflector, $identifier); } /** @return list */ public function locateIdentifiersByType(Reflector $reflector, IdentifierType $identifierType): array { $cacheKey = sprintf('%s_%s', $this->reflectorCacheKey($reflector), $this->identifierTypeToCacheKey($identifierType)); if (array_key_exists($cacheKey, $this->cacheByIdentifierTypeKeyAndOid)) { return $this->cacheByIdentifierTypeKeyAndOid[$cacheKey]; } return $this->cacheByIdentifierTypeKeyAndOid[$cacheKey] = $this->wrappedSourceLocator->locateIdentifiersByType($reflector, $identifierType); } private function reflectorCacheKey(Reflector $reflector): string { return sprintf('type:%s#oid:%s', $reflector::class, spl_object_hash($reflector)); } private function identifierToCacheKey(Identifier $identifier): string { return sprintf( '%s#name:%s', $this->identifierTypeToCacheKey($identifier->getType()), $identifier->getName(), ); } private function identifierTypeToCacheKey(IdentifierType $identifierType): string { return sprintf('type:%s', $identifierType->getName()); } } __halt_compiler();----SIGNATURE:----oNkWhSHTw73lDFFsByrkBFO3EV192fZJwmCUsLdAqO/lJXg0ghIkkwo7cLS89z3pfXBr3ZGWUftx1Teiv6XTVD72INsxkhqIihHKXKFJpBb0OAmtXkIoAJE/ZK9kwG2tFekcVGj2n1Mg5GERgy2V0b+GmUNfGQ7TQVBkgK7uvC0GEWZnDvC/auXsTVRJl1woj8r+loyvfs8jpyAzP0UuQmA1poAqB2bKo6qAPcFbUjKp0shuVeK8rgIWr72KsV4rw55SFaYOGKo16pFf/Q2/idQ5OPOvwWvnwcL4m6T69RwjzMqu7ixLd7TCE+0JFI7quxeQYktggusCjw5yyAXek6PzHmmz+fYhnPz218puxkbWrymMwcO0F0ON/RQkmUkB8rhmQuqLmrv7uTsIO1al48cOPG4ZKIs+zly+kFm6l6KYhkIBuNczydaua7Lk1Yp0dK6LWQZCeutjzUL10ZwomdZ+tWMquAvk/1CPHPav7MQXKhQF4HG0P2gaSduxiqLcPhOJZhF91ob+njHUN+swECeDDFheRQthBTck1saHxWxbmV+kHfEl3v5PSzzBm74AfAM5X7D6kkOSqyuo+zLrHr+T2DE+VoDACculXnOURHzKqOEKlb6qG+0KAD2ttqKA1j0HSRb95Y3gySUNuUfiA0/AeENbFzZN210BPYKT8gI=----ATTACHMENT:----Njg2ODYxOTE1MDQxMjI4MCA4ODgyMjE3ODc1MTQ4MDM1IDkwNTMyODM5ODM5NTkwMjY=