Skip to content

Commit c5fb143

Browse files
committed
Generalize empty array parameters too
1 parent 8377e22 commit c5fb143

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

src/Type/Symfony/ParameterDynamicReturnTypeExtension.php

+17-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPStan\Symfony\ParameterMap;
1111
use PHPStan\Type\ArrayType;
1212
use PHPStan\Type\BooleanType;
13+
use PHPStan\Type\Constant\ConstantArrayType;
1314
use PHPStan\Type\Constant\ConstantBooleanType;
1415
use PHPStan\Type\DynamicMethodReturnTypeExtension;
1516
use PHPStan\Type\FloatType;
@@ -18,7 +19,7 @@
1819
use PHPStan\Type\NullType;
1920
use PHPStan\Type\StringType;
2021
use PHPStan\Type\Type;
21-
use PHPStan\Type\TypeUtils;
22+
use PHPStan\Type\TypeTraverser;
2223
use PHPStan\Type\UnionType;
2324
use function in_array;
2425

@@ -98,7 +99,21 @@ private function getGetTypeFromMethodCall(
9899
if ($parameterKey !== null) {
99100
$parameter = $this->parameterMap->getParameter($parameterKey);
100101
if ($parameter !== null) {
101-
return TypeUtils::generalizeType($scope->getTypeFromValue($parameter->getValue()));
102+
return TypeTraverser::map($scope->getTypeFromValue($parameter->getValue()), static function (\PHPStan\Type\Type $type, callable $traverse): Type {
103+
if ($type instanceof \PHPStan\Type\ConstantType) {
104+
$generalized = $type->generalize();
105+
if ($generalized instanceof ConstantArrayType) {
106+
if (count($generalized->getValueTypes()) !== 0) {
107+
throw new \PHPStan\ShouldNotHappenException();
108+
}
109+
110+
return new ArrayType(new MixedType(), new MixedType());
111+
}
112+
113+
return $generalized;
114+
}
115+
return $traverse($type);
116+
});
102117
}
103118
}
104119

tests/Type/Symfony/container.xml

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
</parameter>
3131
<parameter key="app.binary" type="binary">VGhpcyBpcyBhIEJlbGwgY2hhciAH</parameter>
3232
<parameter key="app.constant">Y-m-d\TH:i:sP</parameter>
33+
<parameter key="test_collection" type="collection"/>
3334
</parameters>
3435

3536
<services>

tests/Type/Symfony/data/ExampleAbstractController.php

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public function parameters(ContainerInterface $container, ParameterBagInterface
6464
assertType("string", $container->getParameter('app.constant'));
6565
assertType("string", $parameterBag->get('app.constant'));
6666
assertType("string", $this->getParameter('app.constant'));
67+
assertType("array", $this->getParameter('test_collection'));
6768

6869
assertType('false', $container->hasParameter('unknown'));
6970
assertType('false', $parameterBag->has('unknown'));

0 commit comments

Comments
 (0)