diff --git a/src/SerializerGenerator.php b/src/SerializerGenerator.php index 77996d9..fe4d556 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,16 @@ private function generateCodeForArray( return $this->templating->renderLoopArray($arrayPath, $modelPath, $index, $innerCode); } + + private static function isArrayForPrimitive(PropertyTypeArray $type): bool + { + do { + $type = $type->getSubType(); + if ($type instanceof PropertyTypePrimitive) { + return true; + } + } while ($type instanceof PropertyTypeArray); + + return 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);