|
50 | 50 | use function constant;
|
51 | 51 | use function count;
|
52 | 52 | use function defined;
|
| 53 | +use function is_int; |
53 | 54 | use function is_string;
|
54 | 55 | use function sprintf;
|
55 | 56 | use const ARRAY_FILTER_USE_BOTH;
|
@@ -126,33 +127,46 @@ public static function selectFromArgs(
|
126 | 127 |
|
127 | 128 | if (count($args) >= 3 && (bool) $args[0]->getAttribute(CurlSetOptArgVisitor::ATTRIBUTE_NAME)) {
|
128 | 129 | $optType = $scope->getType($args[1]->value);
|
129 |
| - if ($optType instanceof ConstantIntegerType) { |
130 |
| - $optValueType = self::getCurlOptValueType($optType->getValue()); |
131 |
| - |
132 |
| - if ($optValueType !== null) { |
133 |
| - $acceptor = $parametersAcceptors[0]; |
134 |
| - $parameters = $acceptor->getParameters(); |
135 |
| - |
136 |
| - $parameters[2] = new NativeParameterReflection( |
137 |
| - $parameters[2]->getName(), |
138 |
| - $parameters[2]->isOptional(), |
139 |
| - $optValueType, |
140 |
| - $parameters[2]->passedByReference(), |
141 |
| - $parameters[2]->isVariadic(), |
142 |
| - $parameters[2]->getDefaultValue(), |
143 |
| - ); |
144 |
| - |
145 |
| - $parametersAcceptors = [ |
146 |
| - new FunctionVariant( |
147 |
| - $acceptor->getTemplateTypeMap(), |
148 |
| - $acceptor->getResolvedTemplateTypeMap(), |
149 |
| - array_values($parameters), |
150 |
| - $acceptor->isVariadic(), |
151 |
| - $acceptor->getReturnType(), |
152 |
| - $acceptor instanceof ExtendedParametersAcceptor ? $acceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(), |
153 |
| - ), |
154 |
| - ]; |
| 130 | + |
| 131 | + $valueTypes = []; |
| 132 | + foreach ($optType->getConstantScalarValues() as $scalarValue) { |
| 133 | + if (!is_int($scalarValue)) { |
| 134 | + $valueTypes = []; |
| 135 | + break; |
| 136 | + } |
| 137 | + |
| 138 | + $valueType = self::getCurlOptValueType($scalarValue); |
| 139 | + if ($valueType === null) { |
| 140 | + $valueTypes = []; |
| 141 | + break; |
155 | 142 | }
|
| 143 | + |
| 144 | + $valueTypes[] = $valueType; |
| 145 | + } |
| 146 | + |
| 147 | + if (count($valueTypes) !== 0) { |
| 148 | + $acceptor = $parametersAcceptors[0]; |
| 149 | + $parameters = $acceptor->getParameters(); |
| 150 | + |
| 151 | + $parameters[2] = new NativeParameterReflection( |
| 152 | + $parameters[2]->getName(), |
| 153 | + $parameters[2]->isOptional(), |
| 154 | + TypeCombinator::union(...$valueTypes), |
| 155 | + $parameters[2]->passedByReference(), |
| 156 | + $parameters[2]->isVariadic(), |
| 157 | + $parameters[2]->getDefaultValue(), |
| 158 | + ); |
| 159 | + |
| 160 | + $parametersAcceptors = [ |
| 161 | + new FunctionVariant( |
| 162 | + $acceptor->getTemplateTypeMap(), |
| 163 | + $acceptor->getResolvedTemplateTypeMap(), |
| 164 | + array_values($parameters), |
| 165 | + $acceptor->isVariadic(), |
| 166 | + $acceptor->getReturnType(), |
| 167 | + $acceptor instanceof ExtendedParametersAcceptor ? $acceptor->getCallSiteVarianceMap() : TemplateTypeVarianceMap::createEmpty(), |
| 168 | + ), |
| 169 | + ]; |
156 | 170 | }
|
157 | 171 | }
|
158 | 172 |
|
|
0 commit comments