Skip to content

Commit 9451f10

Browse files
ParameterDynamicReturnTypeExtension: Only generalizeType for keys
1 parent 7c24540 commit 9451f10

File tree

4 files changed

+36
-23
lines changed

4 files changed

+36
-23
lines changed

src/Type/Symfony/ParameterDynamicReturnTypeExtension.php

+8-11
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use PHPStan\Type\BooleanType;
1515
use PHPStan\Type\Constant\ConstantArrayType;
1616
use PHPStan\Type\Constant\ConstantBooleanType;
17-
use PHPStan\Type\Constant\ConstantIntegerType;
1817
use PHPStan\Type\Constant\ConstantStringType;
1918
use PHPStan\Type\ConstantType;
2019
use PHPStan\Type\DynamicMethodReturnTypeExtension;
@@ -161,7 +160,7 @@ private function generalizeTypeFromValue(Scope $scope, $value): Type
161160
$keyTypes = [];
162161
$valueTypes = [];
163162
foreach ($value as $key => $element) {
164-
/** @var ConstantIntegerType|ConstantStringType $keyType */
163+
/** @var ConstantStringType $keyType */
165164
$keyType = $scope->getTypeFromValue($key);
166165
$keyTypes[] = $keyType;
167166
$valueTypes[] = $this->generalizeTypeFromValue($scope, $element);
@@ -170,15 +169,13 @@ private function generalizeTypeFromValue(Scope $scope, $value): Type
170169
return new ConstantArrayType($keyTypes, $valueTypes);
171170
}
172171

173-
return $this->generalizeType(
174-
new ArrayType(
175-
TypeCombinator::union(...array_map(function ($item) use ($scope): Type {
176-
return $this->generalizeTypeFromValue($scope, $item);
177-
}, array_keys($value))),
178-
TypeCombinator::union(...array_map(function ($item) use ($scope): Type {
179-
return $this->generalizeTypeFromValue($scope, $item);
180-
}, array_values($value)))
181-
)
172+
return new ArrayType(
173+
TypeCombinator::union(...array_map(function ($item) use ($scope): Type {
174+
return $this->generalizeTypeFromValue($scope, $item);
175+
}, array_keys($value))),
176+
TypeCombinator::union(...array_map(function ($item) use ($scope): Type {
177+
return $this->generalizeTypeFromValue($scope, $item);
178+
}, array_values($value)))
182179
);
183180
}
184181

tests/Type/Symfony/container.xml

+10
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@
3737
<parameter key="value">another value</parameter>
3838
</parameter>
3939
</parameter>
40+
<parameter key="app.list_of_different_list" type="collection">
41+
<parameter type="collection">
42+
<parameter key="name">the name</parameter>
43+
<parameter key="value">the value</parameter>
44+
</parameter>
45+
<parameter type="collection">
46+
<parameter key="age">12</parameter>
47+
<parameter key="size">32</parameter>
48+
</parameter>
49+
</parameter>
4050
<parameter key="app.array_of_list" type="collection">
4151
<parameter key="foo" type="collection">
4252
<parameter key="name">the name</parameter>

tests/Type/Symfony/data/ExampleAbstractController.php

+9-6
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,15 @@ public function parameters(ContainerInterface $container, ParameterBagInterface
6565
assertType("array<int, int>", $container->getParameter('app.list_of_int_as_processor'));
6666
assertType("array<int, int>", $parameterBag->get('app.list_of_int_as_processor'));
6767
assertType("array<int, int>", $this->getParameter('app.list_of_int_as_processor'));
68-
assertType("array<int, array<string, string>>", $container->getParameter('app.list_of_list'));
69-
assertType("array<int, array<string, string>>", $parameterBag->get('app.list_of_list'));
70-
assertType("array<int, array<string, string>>", $this->getParameter('app.list_of_list'));
71-
assertType("array<int|string, array<string, string>>", $container->getParameter('app.array_of_list'));
72-
assertType("array<int|string, array<string, string>>", $parameterBag->get('app.array_of_list'));
73-
assertType("array<int|string, array<string, string>>", $this->getParameter('app.array_of_list'));
68+
assertType("array<int, array{name: string, value: string}>", $container->getParameter('app.list_of_list'));
69+
assertType("array<int, array{name: string, value: string}>", $parameterBag->get('app.list_of_list'));
70+
assertType("array<int, array{name: string, value: string}>", $this->getParameter('app.list_of_list'));
71+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $container->getParameter('app.list_of_different_list'));
72+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $parameterBag->get('app.list_of_different_list'));
73+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $this->getParameter('app.list_of_different_list'));
74+
assertType("array<int|string, array{name: string, value: string}>", $container->getParameter('app.array_of_list'));
75+
assertType("array<int|string, array{name: string, value: string}>", $parameterBag->get('app.array_of_list'));
76+
assertType("array<int|string, array{name: string, value: string}>", $this->getParameter('app.array_of_list'));
7477
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $container->getParameter('app.list_of_things'));
7578
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $parameterBag->get('app.list_of_things'));
7679
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $this->getParameter('app.list_of_things'));

tests/Type/Symfony/data/ExampleController.php

+9-6
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,15 @@ public function parameters(ContainerInterface $container, ParameterBagInterface
6565
assertType("array<int, string>", $container->getParameter('app.list'));
6666
assertType("array<int, string>", $parameterBag->get('app.list'));
6767
assertType("array<int, string>", $this->getParameter('app.list'));
68-
assertType("array<int, array<string, string>>", $container->getParameter('app.list_of_list'));
69-
assertType("array<int, array<string, string>>", $parameterBag->get('app.list_of_list'));
70-
assertType("array<int, array<string, string>>", $this->getParameter('app.list_of_list'));
71-
assertType("array<int|string, array<string, string>>", $container->getParameter('app.array_of_list'));
72-
assertType("array<int|string, array<string, string>>", $parameterBag->get('app.array_of_list'));
73-
assertType("array<int|string, array<string, string>>", $this->getParameter('app.array_of_list'));
68+
assertType("array<int, array{name: string, value: string}>", $container->getParameter('app.list_of_list'));
69+
assertType("array<int, array{name: string, value: string}>", $parameterBag->get('app.list_of_list'));
70+
assertType("array<int, array{name: string, value: string}>", $this->getParameter('app.list_of_list'));
71+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $container->getParameter('app.list_of_different_list'));
72+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $parameterBag->get('app.list_of_different_list'));
73+
assertType("array<int, array{age: int, size: int}|array{name: string, value: string}>", $this->getParameter('app.list_of_different_list'));
74+
assertType("array<int|string, array{name: string, value: string}>", $container->getParameter('app.array_of_list'));
75+
assertType("array<int|string, array{name: string, value: string}>", $parameterBag->get('app.array_of_list'));
76+
assertType("array<int|string, array{name: string, value: string}>", $this->getParameter('app.array_of_list'));
7477
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $container->getParameter('app.list_of_things'));
7578
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $parameterBag->get('app.list_of_things'));
7679
assertType("array{url: string, endpoint: string, version: string, payment: array{default: array{username: string, password: string, signature: string}}, api: array{mode: string, default: array{username: string, password: string, signature: string}}}", $this->getParameter('app.list_of_things'));

0 commit comments

Comments
 (0)