* * @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:----XdDwHmssXNUkx1+9R1w55cbFXjvUtz4/ykcuK9WVUSGXkGM3Yflri7BVQv3z0MN/SUYhSjRs1Q+MH01LNPqHbKpZfH4eZJaUeNjJV9UO0Igk5f1hU01hPQD7H7Omhinr0MxQ+q6uSMAH44I8bpQJ9V4AEye+hF0VsXuLYCx1ClDVmMrnI1LUYPY4KAfiSeRNxlI6uTH4MNzzWihVVC1gHdUPvAPMTTvJY1DOW/3iOHg1aKba4JW18Edxwdt5WIU+fwEpclY7fxbuTlCIxvpzGWmtCTQIXRomSSJLJ/xxyxfGtkABiJuVwdJdRIIm2DsmenvzR3cB8dlphNhU7fZulII0/+G66m4JBmmRaq6t3uo/AjVq2Neub8i19HE9diQlVRFv5MYcAz6dEOxr2MRtHlEerY/M2UeIvJf1WilZvwmkXmWefAKHrI/+uJ9lsoF2cBqafHxCcfQnD7RIympFLvKCIWic0oE1BxD9WBeD3Cw0Eew4VBTIzODPHYn9L7L6kZO0DNdcKXL3NRx36I1e2dQ16aKyifs2YF3q+pC/sibgDeONIO9Pog8qDec4qTpYrGh/LXjH41lxydJUj8pL/EsvnoB7Y0W84d0vA829UQDS3htdYyvvJLWj3kMKkXG3UyjPGwjqbwX8vokVc1q51KFbneDu9LuVvRzwFLlKadc=----ATTACHMENT:----OTAzOTM4OTUyOTY0MjkzNSA5OTAzMTMyNTk1ODI0MDYgNjE4MTQyNjk0NjA4MjIyNQ==