Skip to content

Commit 917a912

Browse files
phpstan-botclaude
andcommitted
Fix template type resolving for first-class callable assertions
Use ParametersAcceptorSelector::selectFromArgs() to resolve template types from actual call arguments before applying assertions, matching the pattern used for direct function calls. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 7467880 commit 917a912

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

src/Analyser/TypeSpecifier.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use PHPStan\Node\Printer\ExprPrinter;
2727
use PHPStan\Php\PhpVersion;
2828
use PHPStan\Reflection\Assertions;
29+
use PHPStan\Reflection\Callables\CallableParametersAcceptor;
2930
use PHPStan\Reflection\ExtendedParametersAcceptor;
3031
use PHPStan\Reflection\ParametersAcceptor;
3132
use PHPStan\Reflection\ParametersAcceptorSelector;
@@ -1783,16 +1784,25 @@ private function specifyTypesFromCallableCall(TypeSpecifierContext $context, Fun
17831784
$parametersAcceptor = null;
17841785

17851786
if ($calleeType->isCallable()->yes()) {
1786-
foreach ($calleeType->getCallableParametersAcceptors($scope) as $variant) {
1787+
$variants = $calleeType->getCallableParametersAcceptors($scope);
1788+
$hasAssertions = false;
1789+
foreach ($variants as $variant) {
17871790
$variantAssertions = $variant->getAsserts();
17881791
if ($variantAssertions->getAll() === []) {
17891792
continue;
17901793
}
17911794

1792-
$assertions = $variantAssertions;
1793-
$parametersAcceptor = $variant;
1795+
$hasAssertions = true;
17941796
break;
17951797
}
1798+
1799+
if ($hasAssertions) {
1800+
$resolvedAcceptor = ParametersAcceptorSelector::selectFromArgs($scope, $call->getArgs(), $variants);
1801+
$parametersAcceptor = $resolvedAcceptor;
1802+
if ($resolvedAcceptor instanceof CallableParametersAcceptor) {
1803+
$assertions = $resolvedAcceptor->getAsserts();
1804+
}
1805+
}
17961806
}
17971807

17981808
if ($assertions === null || $assertions->getAll() === [] || $parametersAcceptor === null) {

0 commit comments

Comments
 (0)