|
90 | 90 | use PHPStan\Reflection\Native\NativeMethodReflection;
|
91 | 91 | use PHPStan\Reflection\ParametersAcceptor;
|
92 | 92 | use PHPStan\Reflection\ParametersAcceptorSelector;
|
| 93 | +use PHPStan\Reflection\PassedByReference; |
| 94 | +use PHPStan\Reflection\Php\DummyParameter; |
93 | 95 | use PHPStan\Reflection\Php\PhpMethodReflection;
|
94 | 96 | use PHPStan\Reflection\ReflectionProvider;
|
95 | 97 | use PHPStan\TrinaryLogic;
|
96 | 98 | use PHPStan\Type\Accessory\NonEmptyArrayType;
|
97 | 99 | use PHPStan\Type\ArrayType;
|
| 100 | +use PHPStan\Type\CallableType; |
98 | 101 | use PHPStan\Type\ClosureType;
|
99 | 102 | use PHPStan\Type\Constant\ConstantArrayType;
|
100 | 103 | use PHPStan\Type\Constant\ConstantArrayTypeBuilder;
|
@@ -3153,6 +3156,47 @@ private function processArgs(
|
3153 | 3156 | $scope = $scope->assignVariable($argValue->name, new MixedType());
|
3154 | 3157 | }
|
3155 | 3158 | }
|
| 3159 | + |
| 3160 | + if ($calleeReflection instanceof FunctionReflection) { |
| 3161 | + if ( |
| 3162 | + $i === 0 |
| 3163 | + && $calleeReflection->getName() === 'array_map' |
| 3164 | + && isset($args[1]) |
| 3165 | + ) { |
| 3166 | + $parameterType = new CallableType([ |
| 3167 | + new DummyParameter('item', $scope->getType($args[1]->value)->getIterableValueType(), false, PassedByReference::createNo(), false, null), |
| 3168 | + ], new MixedType(), false); |
| 3169 | + } |
| 3170 | + |
| 3171 | + if ( |
| 3172 | + $i === 1 |
| 3173 | + && $calleeReflection->getName() === 'array_filter' |
| 3174 | + && isset($args[0]) |
| 3175 | + ) { |
| 3176 | + if (isset($args[2])) { |
| 3177 | + $mode = $scope->getType($args[2]->value); |
| 3178 | + if ($mode instanceof ConstantIntegerType) { |
| 3179 | + if ($mode->getValue() === ARRAY_FILTER_USE_KEY) { |
| 3180 | + $arrayFilterParameters = [ |
| 3181 | + new DummyParameter('key', $scope->getType($args[0]->value)->getIterableKeyType(), false, PassedByReference::createNo(), false, null), |
| 3182 | + ]; |
| 3183 | + } elseif ($mode->getValue() === ARRAY_FILTER_USE_BOTH) { |
| 3184 | + $arrayFilterParameters = [ |
| 3185 | + new DummyParameter('item', $scope->getType($args[0]->value)->getIterableValueType(), false, PassedByReference::createNo(), false, null), |
| 3186 | + new DummyParameter('key', $scope->getType($args[0]->value)->getIterableKeyType(), false, PassedByReference::createNo(), false, null), |
| 3187 | + ]; |
| 3188 | + } |
| 3189 | + } |
| 3190 | + } |
| 3191 | + $parameterType = new CallableType( |
| 3192 | + $arrayFilterParameters ?? [ |
| 3193 | + new DummyParameter('item', $scope->getType($args[0]->value)->getIterableValueType(), false, PassedByReference::createNo(), false, null), |
| 3194 | + ], |
| 3195 | + new MixedType(), |
| 3196 | + false |
| 3197 | + ); |
| 3198 | + } |
| 3199 | + } |
3156 | 3200 | }
|
3157 | 3201 |
|
3158 | 3202 | $originalScope = $scope;
|
|
0 commit comments