Skip to content

Commit 0780655

Browse files
committed
Fix Serializer return type for arrays of primitives
1 parent b003bb4 commit 0780655

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

src/Type/Symfony/SerializerDynamicReturnTypeExtension.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Reflection\MethodReflection;
88
use PHPStan\Type\ArrayType;
9+
use PHPStan\Type\BooleanType;
910
use PHPStan\Type\DynamicMethodReturnTypeExtension;
11+
use PHPStan\Type\FloatType;
12+
use PHPStan\Type\IntegerType;
1013
use PHPStan\Type\MixedType;
1114
use PHPStan\Type\ObjectType;
15+
use PHPStan\Type\StringType;
1216
use PHPStan\Type\Type;
1317
use PHPStan\Type\TypeCombinator;
1418
use function count;
@@ -67,6 +71,17 @@ private function getType(string $objectName): Type
6771
return new ArrayType(new MixedType(false), $this->getType(substr($objectName, 0, -2)));
6872
}
6973

74+
switch ($objectName) {
75+
case 'int':
76+
return new IntegerType();
77+
case 'string':
78+
return new StringType();
79+
case 'bool':
80+
return new BooleanType();
81+
case 'float':
82+
return new FloatType();
83+
}
84+
7085
return new ObjectType($objectName);
7186
}
7287

tests/Type/Symfony/ExtensionTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public function dataFileAsserts(): iterable
5454
}
5555

5656
yield from $this->gatherAssertTypes(__DIR__ . '/data/serializer.php');
57+
yield from $this->gatherAssertTypes(__DIR__ . '/data/serializer_primitives.php');
5758

5859
if (class_exists('Symfony\Component\HttpFoundation\InputBag')) {
5960
yield from $this->gatherAssertTypes(__DIR__ . '/data/input_bag_from_request.php');
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php declare(strict_types = 1);
2+
3+
use function PHPStan\Testing\assertType;
4+
5+
$serializer = new \Symfony\Component\Serializer\Serializer();
6+
7+
assertType('int', $serializer->deserialize('...', 'int[]', 'json')[0] + 1);
8+
assertType('string', $serializer->deserialize('...', 'string[]', 'json')[0] . '');
9+
assertType('bool', !$serializer->deserialize('...', 'bool[]', 'json')[0]);
10+
assertType('float', $serializer->deserialize('...', 'float[]', 'json')[0] + 1.0);
11+
assertType('int', $serializer->deserialize('...', 'int[][]', 'json')[0][0] + 1);
12+

0 commit comments

Comments
 (0)