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:----Z7xMMy5UdG2hIHwuCsEUbGa7zWiw9ehgYQABt0gU4HH7zgDi/paAKDA7Iw8TLok0p3vjuPbUpyGz12jsySfIKt7DeiBd3q5D26FfCcvL4YjAFzBndb3GCTEGzbZ4p4D8wubxJC5atYblrBYI+/tpgKKuaYscnqzk7PVxmlGfH8qPWynXe5qItXgTGsEm+hreDh74Z4uSWfW5nhum1eCU8HeZ+4xmn335CnH39bLZ9En3vOS4xuEqBolCW8NAfkWt528F8ZNbfKwvvdCbVQbAUormWo/a98eAirSM+uCXrt8hBjacI3Bj3I7fR5ThHp7r20CgqfeE89OhWMXP15hM5Rd8ne8ELzm+VTpgJZBGo/p/sO61SRCSvzDiT6sFaS3yyOkQahPH78fnBb6NbTEFGlVVOwkhbcg9wpMSpR/WXSm2gh6BqyRme6Ay0ID1rY188k1k8vPV7MS1NrYR+FaSY+eW3dk3ZKLlTwtWG5XeivqIvjAB/AXuO9L/1HPTvXnDbPPj0SSGiVV3CdqjzBN0xICTnWHPMIDxLeQu2lnyn0+2P1Ie6OJsxg6JIPGQGSSUDWctEMtnBWZm49PGGF6oElfnvwy/3tag2bQPrKfEdSq76q/fTrMZ41yaovkuxNkBiIq2o5vGQy+FIblsd6o0ojpXqas/rTQemiTgc5eBAvM=----ATTACHMENT:----OTQ1ODQyNDU0MDYxMDAxOCA5NjQxNDU3MjMxMDYxMDUxIDgzNDMwNTMxOTExMDM2Mzk=