Skip to content

Commit ae20955

Browse files
committed
Fix type-less variadic argument in anonymous function
Type inferrence was ignoring the variadicity of the argument which wrongly resulted in type mixed instead of array<int, mixed>.
1 parent aa92b5b commit ae20955

File tree

3 files changed

+15
-15
lines changed

3 files changed

+15
-15
lines changed

src/Analyser/MutatingScope.php

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2541,24 +2541,20 @@ public function enterAnonymousFunction(
25412541
{
25422542
$variableTypes = [];
25432543
foreach ($closure->params as $i => $parameter) {
2544-
if ($parameter->type === null) {
2545-
if ($callableParameters === null) {
2546-
$parameterType = new MixedType();
2547-
} elseif (isset($callableParameters[$i])) {
2548-
$parameterType = $callableParameters[$i]->getType();
2549-
} elseif (count($callableParameters) > 0) {
2550-
$lastParameter = $callableParameters[count($callableParameters) - 1];
2551-
if ($lastParameter->isVariadic()) {
2552-
$parameterType = $lastParameter->getType();
2553-
} else {
2554-
$parameterType = new MixedType();
2555-
}
2544+
if ($callableParameters === null || $parameter->type !== null) {
2545+
$isNullable = $this->isParameterValueNullable($parameter);
2546+
$parameterType = $this->getFunctionType($parameter->type, $isNullable, $parameter->variadic);
2547+
} elseif (isset($callableParameters[$i])) {
2548+
$parameterType = $callableParameters[$i]->getType();
2549+
} elseif (count($callableParameters) > 0) {
2550+
$lastParameter = $callableParameters[count($callableParameters) - 1];
2551+
if ($lastParameter->isVariadic()) {
2552+
$parameterType = $lastParameter->getType();
25562553
} else {
25572554
$parameterType = new MixedType();
25582555
}
25592556
} else {
2560-
$isNullable = $this->isParameterValueNullable($parameter);
2561-
$parameterType = $this->getFunctionType($parameter->type, $isNullable, $parameter->variadic);
2557+
$parameterType = new MixedType();
25622558
}
25632559

25642560
if (!$parameter->var instanceof Variable || !is_string($parameter->var->name)) {

tests/PHPStan/Analyser/NodeScopeResolverTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4661,6 +4661,10 @@ public function dataAnonymousFunction(): array
46614661
'string',
46624662
'$str',
46634663
],
4664+
[
4665+
'array<int, mixed>',
4666+
'$arr',
4667+
],
46644668
[
46654669
'1',
46664670
'$integer',

tests/PHPStan/Analyser/data/anonymous-function.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
function () {
66
$integer = 1;
7-
function (string $str) use ($integer, $bar) {
7+
function (string $str, ...$arr) use ($integer, $bar) {
88
die;
99
};
1010
};

0 commit comments

Comments
 (0)