From e8ca2ff93c241034789d9af938bd7f5bbffd3d37 Mon Sep 17 00:00:00 2001 From: Romain Canon Date: Fri, 7 Jul 2023 18:11:25 +0200 Subject: [PATCH] fix: make serialization of attributes possible Following up eaa1283, fixes an issue where cache mechanism could break when relying on serialization. --- src/Definition/NativeAttributes.php | 18 +++++----- .../Cache/Compiler/AttributesCompiler.php | 36 ++++++++----------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/Definition/NativeAttributes.php b/src/Definition/NativeAttributes.php index c3ee736c..f4a7b980 100644 --- a/src/Definition/NativeAttributes.php +++ b/src/Definition/NativeAttributes.php @@ -20,16 +20,14 @@ final class NativeAttributes implements Attributes { private AttributesContainer $delegate; - /** @var array> */ - private array $reflectionAttributes; + /** @var array> */ + private array $definition = []; /** * @param ReflectionClass|ReflectionProperty|ReflectionMethod|ReflectionFunction|ReflectionParameter $reflection */ public function __construct(ReflectionClass|ReflectionProperty|ReflectionMethod|ReflectionFunction|ReflectionParameter $reflection) { - $this->reflectionAttributes = $reflection->getAttributes(); - $attributes = array_filter( array_map( static function (ReflectionAttribute $attribute) { @@ -45,10 +43,14 @@ static function (ReflectionAttribute $attribute) { return null; } }, - $this->reflectionAttributes, + $reflection->getAttributes(), ), ); + foreach ($reflection->getAttributes() as $attribute) { + $this->definition[$attribute->getName()] = $attribute->getArguments(); + } + $this->delegate = new AttributesContainer(...$attributes); } @@ -73,10 +75,10 @@ public function count(): int } /** - * @return array> + * @return array> */ - public function reflectionAttributes(): array + public function definition(): array { - return $this->reflectionAttributes; + return $this->definition; } } diff --git a/src/Definition/Repository/Cache/Compiler/AttributesCompiler.php b/src/Definition/Repository/Cache/Compiler/AttributesCompiler.php index 401e10fc..a872f9dd 100644 --- a/src/Definition/Repository/Cache/Compiler/AttributesCompiler.php +++ b/src/Definition/Repository/Cache/Compiler/AttributesCompiler.php @@ -7,9 +7,7 @@ use CuyZ\Valinor\Definition\Attributes; use CuyZ\Valinor\Definition\AttributesContainer; use CuyZ\Valinor\Definition\NativeAttributes; -use ReflectionAttribute; -use function array_map; use function count; use function implode; use function var_export; @@ -32,31 +30,25 @@ public function compile(Attributes $attributes): string PHP; } - /** - * @param ReflectionAttribute $reflectionAttribute - */ - private function compileNativeAttribute(ReflectionAttribute $reflectionAttribute): string + private function compileNativeAttributes(NativeAttributes $attributes): string { - $name = $reflectionAttribute->getName(); - $arguments = $reflectionAttribute->getArguments(); - - /** @infection-ignore-all */ - if (count($arguments) > 0) { - $arguments = serialize($arguments); - $arguments = 'unserialize(' . var_export($arguments, true) . ')'; + $attributes = $attributes->definition(); - return "new $name(...$arguments)"; + if (count($attributes) === 0) { + return '[]'; } - return "new $name()"; - } + $attributesListCode = []; - private function compileNativeAttributes(NativeAttributes $attributes): string - { - $attributesListCode = array_map( - fn (ReflectionAttribute $attribute) => $this->compileNativeAttribute($attribute), - $attributes->reflectionAttributes() - ); + foreach ($attributes as $className => $arguments) { + if (count($arguments) === 0) { + $argumentsCode = ''; + } else { + $argumentsCode = '...unserialize(' . var_export(serialize($arguments), true) . ')'; + } + + $attributesListCode[] = "new $className($argumentsCode)"; + } return '...[' . implode(",\n", $attributesListCode) . ']'; }