Skip to content

Commit b88a6ef

Browse files
committed
Optimization
1 parent 7b160a3 commit b88a6ef

File tree

1 file changed

+42
-0
lines changed

1 file changed

+42
-0
lines changed

src/Reflection/ParametersAcceptorSelector.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
use PHPStan\ShouldNotHappenException;
1010
use PHPStan\TrinaryLogic;
1111
use PHPStan\Type\CallableType;
12+
use PHPStan\Type\ConditionalType;
13+
use PHPStan\Type\ConditionalTypeForParameter;
1214
use PHPStan\Type\Constant\ConstantIntegerType;
15+
use PHPStan\Type\Generic\TemplateType;
1316
use PHPStan\Type\Generic\TemplateTypeMap;
1417
use PHPStan\Type\MixedType;
1518
use PHPStan\Type\NullType;
1619
use PHPStan\Type\Type;
1720
use PHPStan\Type\TypeCombinator;
21+
use PHPStan\Type\TypeTraverser;
1822
use PHPStan\Type\UnionType;
1923
use function array_key_last;
2024
use function array_slice;
@@ -146,6 +150,13 @@ public static function selectFromArgs(
146150
}
147151
}
148152

153+
if (count($parametersAcceptors) === 1) {
154+
$acceptor = $parametersAcceptors[0];
155+
if (!self::hasAcceptorTemplateOrConditionalType($acceptor)) {
156+
return $acceptor;
157+
}
158+
}
159+
149160
foreach ($args as $i => $arg) {
150161
$type = $scope->getType($arg->value);
151162
$index = $arg->name !== null ? $arg->name->toString() : $i;
@@ -160,6 +171,37 @@ public static function selectFromArgs(
160171
return self::selectFromTypes($types, $parametersAcceptors, $unpack);
161172
}
162173

174+
private static function hasAcceptorTemplateOrConditionalType(ParametersAcceptor $acceptor): bool
175+
{
176+
if (self::hasTemplateOrConditionalType($acceptor->getReturnType())) {
177+
return true;
178+
}
179+
180+
foreach ($acceptor->getParameters() as $parameter) {
181+
if (!self::hasTemplateOrConditionalType($parameter->getType())) {
182+
continue;
183+
}
184+
185+
return true;
186+
}
187+
188+
return false;
189+
}
190+
191+
private static function hasTemplateOrConditionalType(Type $type): bool
192+
{
193+
$has = false;
194+
TypeTraverser::map($type, static function (Type $type, callable $traverse) use (&$has): Type {
195+
if ($type instanceof TemplateType || $type instanceof ConditionalType || $type instanceof ConditionalTypeForParameter) {
196+
$has = true;
197+
return $type;
198+
}
199+
200+
return $traverse($type);
201+
});
202+
203+
return $has;
204+
}
163205
/**
164206
* @param array<int|string, Type> $types
165207
* @param ParametersAcceptor[] $parametersAcceptors

0 commit comments

Comments
 (0)