|
9 | 9 | use PHPStan\Analyser\Scope; |
10 | 10 | use PHPStan\Node\Expr\ParameterVariableOriginalValueExpr; |
11 | 11 | use PHPStan\Parser\ArrayFilterArgVisitor; |
| 12 | +use PHPStan\Parser\ArrayFindArgVisitor; |
12 | 13 | use PHPStan\Parser\ArrayMapArgVisitor; |
13 | 14 | use PHPStan\Parser\ArrayWalkArgVisitor; |
14 | 15 | use PHPStan\Parser\ClosureBindArgVisitor; |
@@ -257,6 +258,70 @@ public static function selectFromArgs( |
257 | 258 | ]; |
258 | 259 | } |
259 | 260 |
|
| 261 | + if (isset($args[0]) && (bool) $args[0]->getAttribute(ArrayFindArgVisitor::ATTRIBUTE_NAME)) { |
| 262 | + $acceptor = $parametersAcceptors[0]; |
| 263 | + $parameters = $acceptor->getParameters(); |
| 264 | + $parameters[1] = new NativeParameterReflection( |
| 265 | + $parameters[1]->getName(), |
| 266 | + $parameters[1]->isOptional(), |
| 267 | + new UnionType([ |
| 268 | + new CallableType( |
| 269 | + [ |
| 270 | + new DummyParameter('value', $scope->getIterableValueType($scope->getType($args[0]->value)), false, PassedByReference::createNo(), false, null), |
| 271 | + new DummyParameter('key', $scope->getIterableKeyType($scope->getType($args[0]->value)), false, PassedByReference::createNo(), false, null), |
| 272 | + ], |
| 273 | + new BooleanType(), |
| 274 | + false, |
| 275 | + ), |
| 276 | + new NullType(), |
| 277 | + ]), |
| 278 | + $parameters[1]->passedByReference(), |
| 279 | + $parameters[1]->isVariadic(), |
| 280 | + $parameters[1]->getDefaultValue(), |
| 281 | + ); |
| 282 | + $parametersAcceptors = [ |
| 283 | + new FunctionVariant( |
| 284 | + $acceptor->getTemplateTypeMap(), |
| 285 | + $acceptor->getResolvedTemplateTypeMap(), |
| 286 | + $parameters, |
| 287 | + $acceptor->isVariadic(), |
| 288 | + $acceptor->getReturnType(), |
| 289 | + $acceptor instanceof ParametersAcceptorWithPhpDocs ? $acceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(), |
| 290 | + ), |
| 291 | + ]; |
| 292 | + } |
| 293 | + |
| 294 | + if (isset($args[0]) && (bool) $args[0]->getAttribute(ArrayWalkArgVisitor::ATTRIBUTE_NAME)) { |
| 295 | + $arrayWalkParameters = [ |
| 296 | + new DummyParameter('item', $scope->getIterableValueType($scope->getType($args[0]->value)), false, PassedByReference::createReadsArgument(), false, null), |
| 297 | + new DummyParameter('key', $scope->getIterableKeyType($scope->getType($args[0]->value)), false, PassedByReference::createNo(), false, null), |
| 298 | + ]; |
| 299 | + if (isset($args[2])) { |
| 300 | + $arrayWalkParameters[] = new DummyParameter('arg', $scope->getType($args[2]->value), false, PassedByReference::createNo(), false, null); |
| 301 | + } |
| 302 | + |
| 303 | + $acceptor = $parametersAcceptors[0]; |
| 304 | + $parameters = $acceptor->getParameters(); |
| 305 | + $parameters[1] = new NativeParameterReflection( |
| 306 | + $parameters[1]->getName(), |
| 307 | + $parameters[1]->isOptional(), |
| 308 | + new CallableType($arrayWalkParameters, new MixedType(), false), |
| 309 | + $parameters[1]->passedByReference(), |
| 310 | + $parameters[1]->isVariadic(), |
| 311 | + $parameters[1]->getDefaultValue(), |
| 312 | + ); |
| 313 | + $parametersAcceptors = [ |
| 314 | + new FunctionVariant( |
| 315 | + $acceptor->getTemplateTypeMap(), |
| 316 | + $acceptor->getResolvedTemplateTypeMap(), |
| 317 | + $parameters, |
| 318 | + $acceptor->isVariadic(), |
| 319 | + $acceptor->getReturnType(), |
| 320 | + $acceptor instanceof ParametersAcceptorWithPhpDocs ? $acceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(), |
| 321 | + ), |
| 322 | + ]; |
| 323 | + } |
| 324 | + |
260 | 325 | if (isset($args[0])) { |
261 | 326 | $closureBindToVar = $args[0]->getAttribute(ClosureBindToVarVisitor::ATTRIBUTE_NAME); |
262 | 327 | if ( |
|
0 commit comments