From ee701b3c4dc173bd1f4d9a219807ab114cb80ba4 Mon Sep 17 00:00:00 2001 From: Immanuel Date: Thu, 23 Nov 2023 18:56:28 +0100 Subject: [PATCH 1/2] Revised serializer generation for multidimensional primitive arrays by direct assignment --- src/SerializerGenerator.php | 11 ++++++- .../MultidimensionalArrayForPrimitive.php | 30 +++++++++++++++++++ tests/Fixtures/PrimitiveArraySubType.php | 15 ---------- tests/Unit/SerializerGeneratorTest.php | 26 +++++++++++----- 4 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 tests/Fixtures/MultidimensionalArrayForPrimitive.php delete mode 100644 tests/Fixtures/PrimitiveArraySubType.php diff --git a/src/SerializerGenerator.php b/src/SerializerGenerator.php index 77996d9..12fa8ad 100644 --- a/src/SerializerGenerator.php +++ b/src/SerializerGenerator.php @@ -224,7 +224,7 @@ private function generateCodeForArray( switch ($subType) { case $subType instanceof PropertyTypePrimitive: - case $subType instanceof PropertyTypeArray && $subType->getSubType() instanceof PropertyTypePrimitive: + case $subType instanceof PropertyTypeArray && self::isArrayForPrimitive($subType): case $subType instanceof PropertyTypeUnknown && $this->configuration->shouldAllowGenericArrays(): return $this->templating->renderArrayAssign($arrayPath, $modelPath); @@ -254,4 +254,13 @@ private function generateCodeForArray( return $this->templating->renderLoopArray($arrayPath, $modelPath, $index, $innerCode); } + + private static function isArrayForPrimitive(PropertyTypeArray $type): bool + { + return match ($type->getSubType()::class) { + PropertyTypePrimitive::class => true, + PropertyTypeArray::class => self::isArrayForPrimitive($type->getSubType()), + default => false, + }; + } } diff --git a/tests/Fixtures/MultidimensionalArrayForPrimitive.php b/tests/Fixtures/MultidimensionalArrayForPrimitive.php new file mode 100644 index 0000000..664a488 --- /dev/null +++ b/tests/Fixtures/MultidimensionalArrayForPrimitive.php @@ -0,0 +1,30 @@ +>") + */ + public array $twoDims = []; + + /** + * @Serializer\Type("array>>>>") + */ + public array $fiveDims = []; + + /** + * @Serializer\Type("array>") + */ + public array $mapOfLists = []; + + /** + * @Serializer\Type("array>>") + */ + public array $listOfMapOfLists = []; +} diff --git a/tests/Fixtures/PrimitiveArraySubType.php b/tests/Fixtures/PrimitiveArraySubType.php deleted file mode 100644 index bf0ae7f..0000000 --- a/tests/Fixtures/PrimitiveArraySubType.php +++ /dev/null @@ -1,15 +0,0 @@ ->") - */ - public array $primitivesLists = []; -} diff --git a/tests/Unit/SerializerGeneratorTest.php b/tests/Unit/SerializerGeneratorTest.php index 2d8c447..6f926a8 100644 --- a/tests/Unit/SerializerGeneratorTest.php +++ b/tests/Unit/SerializerGeneratorTest.php @@ -17,9 +17,9 @@ use Tests\Liip\Serializer\Fixtures\Inheritance; use Tests\Liip\Serializer\Fixtures\ListModel; use Tests\Liip\Serializer\Fixtures\Model; +use Tests\Liip\Serializer\Fixtures\MultidimensionalArrayForPrimitive; use Tests\Liip\Serializer\Fixtures\Nested; use Tests\Liip\Serializer\Fixtures\PostDeserialize; -use Tests\Liip\Serializer\Fixtures\PrimitiveArraySubType; use Tests\Liip\Serializer\Fixtures\PrivateProperty; use Tests\Liip\Serializer\Fixtures\RecursionModel; use Tests\Liip\Serializer\Fixtures\UnknownArraySubType; @@ -143,17 +143,27 @@ public function testArraysWithUnknownSubType(): void self::assertSame($expected, $data); } - public function testArraysWithPrimitiveSubType(): void + public function testMultidimensionalArraysForPrimitives(): void { - $functionName = 'serialize_Tests_Liip_Serializer_Fixtures_PrimitiveArraySubType'; - self::generateSerializers(self::$metadataBuilder, PrimitiveArraySubType::class, [$functionName], ['']); + $functionName = 'serialize_Tests_Liip_Serializer_Fixtures_MultidimensionalArrayForPrimitive'; + self::generateSerializers(self::$metadataBuilder, MultidimensionalArrayForPrimitive::class, [$functionName], ['']); - $subject = new PrimitiveArraySubType(); - $lists = [[1, 2, 3], [4, 5, 6]]; - $subject->primitivesLists = $lists; + $subject = new MultidimensionalArrayForPrimitive(); + $twoDims = [0 => [0], 1 => [1]]; + $fiveDims = [0 => [0 => [0 => [0 => [2]]]], 1 => [3 => [0 => [0 => [3]]]]]; + $mapOfLists = ['foo' => [0], 'bar' => 1]; + $listOfMapOfLists = [0 => ['m00' => [0 => [0], 1 => [1]], 'm01' => [0 => [0]]], 1 => ['m10' => [0 => [42]]]]; + + $subject->twoDims = $twoDims; + $subject->fiveDims = $fiveDims; + $subject->mapOfLists = $mapOfLists; + $subject->listOfMapOfLists = $listOfMapOfLists; $expected = [ - 'primitives_lists' => $lists, + 'two_dims' => $twoDims, + 'five_dims' => $fiveDims, + 'map_of_lists' => $mapOfLists, + 'list_of_map_of_lists' => $listOfMapOfLists, ]; $data = $functionName($subject); From 13d3f94ee739173624c82f1665f508c6f55695c6 Mon Sep 17 00:00:00 2001 From: Immanuel Date: Fri, 24 Nov 2023 14:54:31 +0100 Subject: [PATCH 2/2] Replaced recursion by iteration --- src/SerializerGenerator.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/SerializerGenerator.php b/src/SerializerGenerator.php index 12fa8ad..fe4d556 100644 --- a/src/SerializerGenerator.php +++ b/src/SerializerGenerator.php @@ -257,10 +257,13 @@ private function generateCodeForArray( private static function isArrayForPrimitive(PropertyTypeArray $type): bool { - return match ($type->getSubType()::class) { - PropertyTypePrimitive::class => true, - PropertyTypeArray::class => self::isArrayForPrimitive($type->getSubType()), - default => false, - }; + do { + $type = $type->getSubType(); + if ($type instanceof PropertyTypePrimitive) { + return true; + } + } while ($type instanceof PropertyTypeArray); + + return false; } }