From 8377e227368bdec99d4753a8a050e162450c2217 Mon Sep 17 00:00:00 2001 From: Alexander Schranz Date: Mon, 3 May 2021 11:16:42 +0200 Subject: [PATCH] Change parameterbag scalar type inference to generalized type --- .../ParameterDynamicReturnTypeExtension.php | 3 +- .../data/ExampleAbstractController.php | 72 +++++++++---------- tests/Type/Symfony/data/ExampleController.php | 72 +++++++++---------- 3 files changed, 74 insertions(+), 73 deletions(-) diff --git a/src/Type/Symfony/ParameterDynamicReturnTypeExtension.php b/src/Type/Symfony/ParameterDynamicReturnTypeExtension.php index adce58fb..071020c8 100644 --- a/src/Type/Symfony/ParameterDynamicReturnTypeExtension.php +++ b/src/Type/Symfony/ParameterDynamicReturnTypeExtension.php @@ -18,6 +18,7 @@ use PHPStan\Type\NullType; use PHPStan\Type\StringType; use PHPStan\Type\Type; +use PHPStan\Type\TypeUtils; use PHPStan\Type\UnionType; use function in_array; @@ -97,7 +98,7 @@ private function getGetTypeFromMethodCall( if ($parameterKey !== null) { $parameter = $this->parameterMap->getParameter($parameterKey); if ($parameter !== null) { - return $scope->getTypeFromValue($parameter->getValue()); + return TypeUtils::generalizeType($scope->getTypeFromValue($parameter->getValue())); } } diff --git a/tests/Type/Symfony/data/ExampleAbstractController.php b/tests/Type/Symfony/data/ExampleAbstractController.php index 2bff7543..4b910774 100644 --- a/tests/Type/Symfony/data/ExampleAbstractController.php +++ b/tests/Type/Symfony/data/ExampleAbstractController.php @@ -28,42 +28,42 @@ public function parameters(ContainerInterface $container, ParameterBagInterface assertType('array|bool|float|int|string|null', $container->getParameter('unknown')); assertType('array|bool|float|int|string|null', $parameterBag->get('unknown')); assertType('array|bool|float|int|string|null', $this->getParameter('unknown')); - assertType("'abcdef'", $container->getParameter('app.string')); - assertType("'abcdef'", $parameterBag->get('app.string')); - assertType("'abcdef'", $this->getParameter('app.string')); - assertType('123', $container->getParameter('app.int')); - assertType('123', $parameterBag->get('app.int')); - assertType('123', $this->getParameter('app.int')); - assertType("'123'", $container->getParameter('app.int_as_string')); - assertType("'123'", $parameterBag->get('app.int_as_string')); - assertType("'123'", $this->getParameter('app.int_as_string')); - assertType('123.45', $container->getParameter('app.float')); - assertType('123.45', $parameterBag->get('app.float')); - assertType('123.45', $this->getParameter('app.float')); - assertType("'123.45'", $container->getParameter('app.float_as_string')); - assertType("'123.45'", $parameterBag->get('app.float_as_string')); - assertType("'123.45'", $this->getParameter('app.float_as_string')); - assertType('true', $container->getParameter('app.boolean')); - assertType('true', $parameterBag->get('app.boolean')); - assertType('true', $this->getParameter('app.boolean')); - assertType("'true'", $container->getParameter('app.boolean_as_string')); - assertType("'true'", $parameterBag->get('app.boolean_as_string')); - assertType("'true'", $this->getParameter('app.boolean_as_string')); - assertType("array('en', 'es', 'fr')", $container->getParameter('app.list')); - assertType("array('en', 'es', 'fr')", $parameterBag->get('app.list')); - assertType("array('en', 'es', 'fr')", $this->getParameter('app.list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $container->getParameter('app.list_of_list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $parameterBag->get('app.list_of_list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $this->getParameter('app.list_of_list')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $container->getParameter('app.map')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $parameterBag->get('app.map')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $this->getParameter('app.map')); - assertType("'This is a Bell char '", $container->getParameter('app.binary')); - assertType("'This is a Bell char '", $parameterBag->get('app.binary')); - assertType("'This is a Bell char '", $this->getParameter('app.binary')); - assertType("'Y-m-d\\\\TH:i:sP'", $container->getParameter('app.constant')); - assertType("'Y-m-d\\\\TH:i:sP'", $parameterBag->get('app.constant')); - assertType("'Y-m-d\\\\TH:i:sP'", $this->getParameter('app.constant')); + assertType("string", $container->getParameter('app.string')); + assertType("string", $parameterBag->get('app.string')); + assertType("string", $this->getParameter('app.string')); + assertType('int', $container->getParameter('app.int')); + assertType('int', $parameterBag->get('app.int')); + assertType('int', $this->getParameter('app.int')); + assertType("string", $container->getParameter('app.int_as_string')); + assertType("string", $parameterBag->get('app.int_as_string')); + assertType("string", $this->getParameter('app.int_as_string')); + assertType('float', $container->getParameter('app.float')); + assertType('float', $parameterBag->get('app.float')); + assertType('float', $this->getParameter('app.float')); + assertType("string", $container->getParameter('app.float_as_string')); + assertType("string", $parameterBag->get('app.float_as_string')); + assertType("string", $this->getParameter('app.float_as_string')); + assertType('bool', $container->getParameter('app.boolean')); + assertType('bool', $parameterBag->get('app.boolean')); + assertType('bool', $this->getParameter('app.boolean')); + assertType("string", $container->getParameter('app.boolean_as_string')); + assertType("string", $parameterBag->get('app.boolean_as_string')); + assertType("string", $this->getParameter('app.boolean_as_string')); + assertType("array&nonEmpty", $container->getParameter('app.list')); + assertType("array&nonEmpty", $parameterBag->get('app.list')); + assertType("array&nonEmpty", $this->getParameter('app.list')); + assertType("array&nonEmpty>&nonEmpty", $container->getParameter('app.list_of_list')); + assertType("array&nonEmpty>&nonEmpty", $parameterBag->get('app.list_of_list')); + assertType("array&nonEmpty>&nonEmpty", $this->getParameter('app.list_of_list')); + assertType("array&nonEmpty", $container->getParameter('app.map')); + assertType("array&nonEmpty", $parameterBag->get('app.map')); + assertType("array&nonEmpty", $this->getParameter('app.map')); + assertType("string", $container->getParameter('app.binary')); + assertType("string", $parameterBag->get('app.binary')); + assertType("string", $this->getParameter('app.binary')); + assertType("string", $container->getParameter('app.constant')); + assertType("string", $parameterBag->get('app.constant')); + assertType("string", $this->getParameter('app.constant')); assertType('false', $container->hasParameter('unknown')); assertType('false', $parameterBag->has('unknown')); diff --git a/tests/Type/Symfony/data/ExampleController.php b/tests/Type/Symfony/data/ExampleController.php index db761227..1d8edf48 100644 --- a/tests/Type/Symfony/data/ExampleController.php +++ b/tests/Type/Symfony/data/ExampleController.php @@ -28,42 +28,42 @@ public function parameters(ContainerInterface $container, ParameterBagInterface assertType('array|bool|float|int|string|null', $container->getParameter('unknown')); assertType('array|bool|float|int|string|null', $parameterBag->get('unknown')); assertType('array|bool|float|int|string|null', $this->getParameter('unknown')); - assertType("'abcdef'", $container->getParameter('app.string')); - assertType("'abcdef'", $parameterBag->get('app.string')); - assertType("'abcdef'", $this->getParameter('app.string')); - assertType('123', $container->getParameter('app.int')); - assertType('123', $parameterBag->get('app.int')); - assertType('123', $this->getParameter('app.int')); - assertType("'123'", $container->getParameter('app.int_as_string')); - assertType("'123'", $parameterBag->get('app.int_as_string')); - assertType("'123'", $this->getParameter('app.int_as_string')); - assertType('123.45', $container->getParameter('app.float')); - assertType('123.45', $parameterBag->get('app.float')); - assertType('123.45', $this->getParameter('app.float')); - assertType("'123.45'", $container->getParameter('app.float_as_string')); - assertType("'123.45'", $parameterBag->get('app.float_as_string')); - assertType("'123.45'", $this->getParameter('app.float_as_string')); - assertType('true', $container->getParameter('app.boolean')); - assertType('true', $parameterBag->get('app.boolean')); - assertType('true', $this->getParameter('app.boolean')); - assertType("'true'", $container->getParameter('app.boolean_as_string')); - assertType("'true'", $parameterBag->get('app.boolean_as_string')); - assertType("'true'", $this->getParameter('app.boolean_as_string')); - assertType("array('en', 'es', 'fr')", $container->getParameter('app.list')); - assertType("array('en', 'es', 'fr')", $parameterBag->get('app.list')); - assertType("array('en', 'es', 'fr')", $this->getParameter('app.list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $container->getParameter('app.list_of_list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $parameterBag->get('app.list_of_list')); - assertType("array(array('name' => 'the name', 'value' => 'the value'), array('name' => 'another name', 'value' => 'another value'))", $this->getParameter('app.list_of_list')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $container->getParameter('app.map')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $parameterBag->get('app.map')); - assertType("array('a' => 'value of a', 'b' => 'value of b', 'c' => 'value of c')", $this->getParameter('app.map')); - assertType("'This is a Bell char '", $container->getParameter('app.binary')); - assertType("'This is a Bell char '", $parameterBag->get('app.binary')); - assertType("'This is a Bell char '", $this->getParameter('app.binary')); - assertType("'Y-m-d\\\\TH:i:sP'", $container->getParameter('app.constant')); - assertType("'Y-m-d\\\\TH:i:sP'", $parameterBag->get('app.constant')); - assertType("'Y-m-d\\\\TH:i:sP'", $this->getParameter('app.constant')); + assertType("string", $container->getParameter('app.string')); + assertType("string", $parameterBag->get('app.string')); + assertType("string", $this->getParameter('app.string')); + assertType('int', $container->getParameter('app.int')); + assertType('int', $parameterBag->get('app.int')); + assertType('int', $this->getParameter('app.int')); + assertType("string", $container->getParameter('app.int_as_string')); + assertType("string", $parameterBag->get('app.int_as_string')); + assertType("string", $this->getParameter('app.int_as_string')); + assertType('float', $container->getParameter('app.float')); + assertType('float', $parameterBag->get('app.float')); + assertType('float', $this->getParameter('app.float')); + assertType("string", $container->getParameter('app.float_as_string')); + assertType("string", $parameterBag->get('app.float_as_string')); + assertType("string", $this->getParameter('app.float_as_string')); + assertType('bool', $container->getParameter('app.boolean')); + assertType('bool', $parameterBag->get('app.boolean')); + assertType('bool', $this->getParameter('app.boolean')); + assertType("string", $container->getParameter('app.boolean_as_string')); + assertType("string", $parameterBag->get('app.boolean_as_string')); + assertType("string", $this->getParameter('app.boolean_as_string')); + assertType("array&nonEmpty", $container->getParameter('app.list')); + assertType("array&nonEmpty", $parameterBag->get('app.list')); + assertType("array&nonEmpty", $this->getParameter('app.list')); + assertType("array&nonEmpty>&nonEmpty", $container->getParameter('app.list_of_list')); + assertType("array&nonEmpty>&nonEmpty", $parameterBag->get('app.list_of_list')); + assertType("array&nonEmpty>&nonEmpty", $this->getParameter('app.list_of_list')); + assertType("array&nonEmpty", $container->getParameter('app.map')); + assertType("array&nonEmpty", $parameterBag->get('app.map')); + assertType("array&nonEmpty", $this->getParameter('app.map')); + assertType("string", $container->getParameter('app.binary')); + assertType("string", $parameterBag->get('app.binary')); + assertType("string", $this->getParameter('app.binary')); + assertType("string", $container->getParameter('app.constant')); + assertType("string", $parameterBag->get('app.constant')); + assertType("string", $this->getParameter('app.constant')); assertType('false', $container->hasParameter('unknown')); assertType('false', $parameterBag->has('unknown'));