|
15 | 15 | use PHPStan\Parser\ClosureBindArgVisitor;
|
16 | 16 | use PHPStan\Parser\ClosureBindToVarVisitor;
|
17 | 17 | use PHPStan\Parser\CurlSetOptArgVisitor;
|
| 18 | +use PHPStan\Parser\CurlSetOptArrayArgVisitor; |
18 | 19 | use PHPStan\Parser\ImplodeArgVisitor;
|
19 | 20 | use PHPStan\Reflection\Callables\CallableParametersAcceptor;
|
20 | 21 | use PHPStan\Reflection\Native\NativeParameterReflection;
|
|
26 | 27 | use PHPStan\Type\ArrayType;
|
27 | 28 | use PHPStan\Type\BooleanType;
|
28 | 29 | use PHPStan\Type\CallableType;
|
| 30 | +use PHPStan\Type\Constant\ConstantArrayTypeBuilder; |
29 | 31 | use PHPStan\Type\Constant\ConstantIntegerType;
|
30 | 32 | use PHPStan\Type\Generic\TemplateType;
|
31 | 33 | use PHPStan\Type\Generic\TemplateTypeMap;
|
@@ -170,6 +172,56 @@ public static function selectFromArgs(
|
170 | 172 | }
|
171 | 173 | }
|
172 | 174 |
|
| 175 | + if (count($args) >= 2 && (bool) $args[1]->getAttribute(CurlSetOptArrayArgVisitor::ATTRIBUTE_NAME)) { |
| 176 | + $optArrayType = $scope->getType($args[1]->value); |
| 177 | + |
| 178 | + $hasTypes = false; |
| 179 | + $builder = ConstantArrayTypeBuilder::createEmpty(); |
| 180 | + foreach ($optArrayType->getIterableKeyType()->getConstantScalarValues() as $optValue) { |
| 181 | + if (!is_int($optValue)) { |
| 182 | + $hasTypes = false; |
| 183 | + break; |
| 184 | + } |
| 185 | + |
| 186 | + $optValueType = self::getCurlOptValueType($optValue); |
| 187 | + if ($optValueType === null) { |
| 188 | + $hasTypes = false; |
| 189 | + break; |
| 190 | + } |
| 191 | + |
| 192 | + $hasTypes = true; |
| 193 | + $builder->setOffsetValueType( |
| 194 | + new ConstantIntegerType($optValue), |
| 195 | + $optValueType, |
| 196 | + ); |
| 197 | + } |
| 198 | + |
| 199 | + if ($hasTypes) { |
| 200 | + $acceptor = $parametersAcceptors[0]; |
| 201 | + $parameters = $acceptor->getParameters(); |
| 202 | + |
| 203 | + $parameters[1] = new NativeParameterReflection( |
| 204 | + $parameters[1]->getName(), |
| 205 | + $parameters[1]->isOptional(), |
| 206 | + $builder->getArray(), |
| 207 | + $parameters[1]->passedByReference(), |
| 208 | + $parameters[1]->isVariadic(), |
| 209 | + $parameters[1]->getDefaultValue(), |
| 210 | + ); |
| 211 | + |
| 212 | + $parametersAcceptors = [ |
| 213 | + new FunctionVariant( |
| 214 | + $acceptor->getTemplateTypeMap(), |
| 215 | + $acceptor->getResolvedTemplateTypeMap(), |
| 216 | + array_values($parameters), |
| 217 | + $acceptor->isVariadic(), |
| 218 | + $acceptor->getReturnType(), |
| 219 | + $acceptor instanceof ExtendedParametersAcceptor ? $acceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(), |
| 220 | + ), |
| 221 | + ]; |
| 222 | + } |
| 223 | + } |
| 224 | + |
173 | 225 | if ((bool) $args[0]->getAttribute(ArrayFilterArgVisitor::ATTRIBUTE_NAME)) {
|
174 | 226 | if (isset($args[2])) {
|
175 | 227 | $mode = $scope->getType($args[2]->value);
|
|
0 commit comments