Skip to content

Commit

Permalink
Merge pull request #42 from drieschel/direct_assign_multidimensional_…
Browse files Browse the repository at this point in the history
…array_for_primitives

Improvement: Assign multidimensional arrays for primitives directly
  • Loading branch information
dbu authored Nov 24, 2023
2 parents 86818f4 + 13d3f94 commit a5ccc56
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 24 deletions.
14 changes: 13 additions & 1 deletion src/SerializerGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
}
}
30 changes: 30 additions & 0 deletions tests/Fixtures/MultidimensionalArrayForPrimitive.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

namespace Tests\Liip\Serializer\Fixtures;

use JMS\Serializer\Annotation as Serializer;

class MultidimensionalArrayForPrimitive
{
/**
* @Serializer\Type("array<int, array<int>>")
*/
public array $twoDims = [];

/**
* @Serializer\Type("array<int, array<int, array<int, array<int, array<int>>>>>")
*/
public array $fiveDims = [];

/**
* @Serializer\Type("array<string, array<int>>")
*/
public array $mapOfLists = [];

/**
* @Serializer\Type("array<int, array<string, array<int>>>")
*/
public array $listOfMapOfLists = [];
}
15 changes: 0 additions & 15 deletions tests/Fixtures/PrimitiveArraySubType.php

This file was deleted.

26 changes: 18 additions & 8 deletions tests/Unit/SerializerGeneratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit a5ccc56

Please sign in to comment.