diff --git a/src/Type/Symfony/SerializerDynamicReturnTypeExtension.php b/src/Type/Symfony/SerializerDynamicReturnTypeExtension.php index 84f256e4..a2ad047c 100755 --- a/src/Type/Symfony/SerializerDynamicReturnTypeExtension.php +++ b/src/Type/Symfony/SerializerDynamicReturnTypeExtension.php @@ -6,9 +6,13 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; use PHPStan\Type\ArrayType; +use PHPStan\Type\BooleanType; use PHPStan\Type\DynamicMethodReturnTypeExtension; +use PHPStan\Type\FloatType; +use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; +use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use function count; @@ -67,6 +71,17 @@ private function getType(string $objectName): Type return new ArrayType(new MixedType(false), $this->getType(substr($objectName, 0, -2))); } + switch ($objectName) { + case 'int': + return new IntegerType(); + case 'string': + return new StringType(); + case 'bool': + return new BooleanType(); + case 'float': + return new FloatType(); + } + return new ObjectType($objectName); } diff --git a/tests/Type/Symfony/ExtensionTest.php b/tests/Type/Symfony/ExtensionTest.php index c749203a..0610cb64 100644 --- a/tests/Type/Symfony/ExtensionTest.php +++ b/tests/Type/Symfony/ExtensionTest.php @@ -54,6 +54,7 @@ public function dataFileAsserts(): iterable } yield from $this->gatherAssertTypes(__DIR__ . '/data/serializer.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/serializer_primitives.php'); if (class_exists('Symfony\Component\HttpFoundation\InputBag')) { yield from $this->gatherAssertTypes(__DIR__ . '/data/input_bag_from_request.php'); diff --git a/tests/Type/Symfony/data/serializer_primitives.php b/tests/Type/Symfony/data/serializer_primitives.php new file mode 100644 index 00000000..f0cfef06 --- /dev/null +++ b/tests/Type/Symfony/data/serializer_primitives.php @@ -0,0 +1,12 @@ +deserialize('...', 'int[]', 'json')[0] + 1); +assertType('string', $serializer->deserialize('...', 'string[]', 'json')[0] . ''); +assertType('bool', !$serializer->deserialize('...', 'bool[]', 'json')[0]); +assertType('float', $serializer->deserialize('...', 'float[]', 'json')[0] + 1.0); +assertType('int', $serializer->deserialize('...', 'int[][]', 'json')[0][0] + 1); +