* * @psalm-pure */ public static function createAttributes( Reflector $reflector, ReflectionClass|ReflectionMethod|ReflectionFunction|ReflectionClassConstant|ReflectionEnumCase|ReflectionProperty|ReflectionParameter $reflection, array $attrGroups, ) { $repeated = []; foreach ($attrGroups as $attributesGroupNode) { foreach ($attributesGroupNode->attrs as $attributeNode) { $repeated[$attributeNode->name->toLowerString()][] = $attributeNode; } } $attributes = []; foreach ($attrGroups as $attributesGroupNode) { foreach ($attributesGroupNode->attrs as $attributeNode) { $attributes[] = new ReflectionAttribute( $reflector, $attributeNode, $reflection, count($repeated[$attributeNode->name->toLowerString()]) > 1, ); } } return $attributes; } /** * @param list $attributes * * @return list * * @psalm-pure */ public static function filterAttributesByName(array $attributes, string $name): array { return array_values(array_filter($attributes, static fn (ReflectionAttribute $attribute): bool => $attribute->getName() === $name)); } /** * @param list $attributes * @param class-string $className * * @return list * * @psalm-pure */ public static function filterAttributesByInstance(array $attributes, string $className): array { return array_values(array_filter($attributes, static function (ReflectionAttribute $attribute) use ($className): bool { $class = $attribute->getClass(); return $class->getName() === $className || $class->isSubclassOf($className) || $class->implementsInterface($className); })); } } __halt_compiler();----SIGNATURE:----Uv8MnNeibhAYu5Tf6lghufttnIUe9YvL34DgvygxNIB4ngjM4IXveOaj/VvOhPjf1f2CBFTBbbg1zxVKgrtOrchhJIebPED2UHeMY5+l1Yx7ucyWM+UAC/y0teRwXNWVp5dzPPppZ1dHjQ2Sn7I8r0/53oFcNOP5vj0RFGOe5WQ7QSErTXTUFdKMY9APYOWekCPBH9qtTNqT81xF+EiQQI0l2VDSOLHKT/QQb9AMYpMmxJtZZoQuzHXk843l2C2AgdoohG2jkNk/ro7k00HCVAQoy2SWPMfqTbtvn88Upo5mj/213av1sXlysKYtKwCFXa9xLFUozndOsVwLkhSHBYdeqBFkm82JHkXguQq/F0UBsm1QPxvauJiCThEjMEQMF1Fmr3sYv77Mq2MEFshNW5qFAGeurQZbL8UWZPxhPK6ebGX8HcyA+ENxF+snGGfYwJJQky4S92qxJFu02d4K9+kh7tv0UuuUTO0GjSSfbqFDD1LPRe5WM0QZoP//+hYJM0wkL3iVko2prQFi+oHewLo0wNL7OT+TqaWO4GDQqCvDdIiDpb9CR2uP1s941itll/zoGfgVVxe1V9Ko941rjB6vxJcL4ciJxxQqTbZIGTMAC5NhVrlydtuoqcbwbrDjoHB9ycPuqEuGCQJHbLoylEKSvairybVz5AmQBMAc6vU=----ATTACHMENT:----OTY3NjA4NjY1MDg5NDgyNiA5NjYzMjk5MTk0MDA5NzEyIDg3MDk0MDQ4MTQzNjk4OTk=