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:----kFN+KNHvdryfMD8jHjgzziVACqhbTCYF0BMdgFC2KuVqByEIiBTTzqzno6MLSr9tvwkQ40OCKHFKDE3AHDgUMzQffxUbNTbqbglF7PY9dpRJgHHNkp06sbq33R132wkssbpSXTp1BRmtgwm4548BhupIlSm9WjxrZgP2rzIfnvLv9+i7t3jIvHi6necrjd6IZfeGxFrEALSqISgZwn25FdQR2dS8VSGQZrUenYq0frDD02F4NuP7G2aLDhte2/+CBPVtK3FOU7PPMM1cYoRwW+TDttV2cjhjpN6gJhu1kxLTQoDiVkXvtKylpOl29pDtOWJRreSx+z+BRUpapYcmV2EhVH4Gzna197lfB8jpe+lWCzs+ieojGvHy6A7hU8RkRz77LSYqHILEsNZ2SYdOi9KJ+2ExURpOgx1MDSnlFhvxf/Rko3iDOWBBBGY7MWvGAh5y1KqV2ubIWXzIqpbIWBJyCJYOnwyPAtdLPlu0dwljYcyXiqldT9FHisbGxMgEKp9Ic2Os599kjmh7PyirNmjQ8CsLhTd5EV5zXmTLV/dTxNf5YyASfuz0/8IHOmoioTv3ZYvKq8A+CQ4/0oEZQcKuFGiRZjKrMNxlSDO3xD8ojgNISqI6BrevHUwIxCC8KUI+9vW13jtTHYoTqFmXBxXZTOC7iYWPmhOExOvmCfs=----ATTACHMENT:----NTk1NTk1MTg2NDY1ODgwNiA0OTk0ODQ4NzM3OTk3Njk5IDIwNTc3Nzc1Njc1MTUzOTg=