Skip to content

Commit 8ae0b28

Browse files
committed
Fix conditional types in PHPDocs from stubs for native functions
1 parent 518d3a3 commit 8ae0b28

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/PhpDoc/ResolvedPhpDocBlock.php

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -281,14 +281,26 @@ public function changeParameterNamesByMapping(array $parameterNameMapping): self
281281
return $this;
282282
}
283283

284+
$mapParameterCb = static function (Type $type, callable $traverse) use ($parameterNameMapping): Type {
285+
if ($type instanceof ConditionalTypeForParameter) {
286+
$parameterName = substr($type->getParameterName(), 1);
287+
if (array_key_exists($parameterName, $parameterNameMapping)) {
288+
$type = $type->changeParameterName('$' . $parameterNameMapping[$parameterName]);
289+
}
290+
}
291+
292+
return $traverse($type);
293+
};
294+
284295
$paramTags = $this->getParamTags();
285296

286297
$newParamTags = [];
287298
foreach ($paramTags as $key => $paramTag) {
288299
if (!array_key_exists($key, $parameterNameMapping)) {
289300
continue;
290301
}
291-
$newParamTags[$parameterNameMapping[$key]] = $paramTag;
302+
$transformedType = TypeTraverser::map($paramTag->getType(), $mapParameterCb);
303+
$newParamTags[$parameterNameMapping[$key]] = $paramTag->withType($transformedType);
292304
}
293305

294306
$paramOutTags = $this->getParamOutTags();
@@ -298,21 +310,14 @@ public function changeParameterNamesByMapping(array $parameterNameMapping): self
298310
if (!array_key_exists($key, $parameterNameMapping)) {
299311
continue;
300312
}
301-
$newParamOutTags[$parameterNameMapping[$key]] = $paramOutTag;
313+
314+
$transformedType = TypeTraverser::map($paramOutTag->getType(), $mapParameterCb);
315+
$newParamOutTags[$parameterNameMapping[$key]] = $paramOutTag->withType($transformedType);
302316
}
303317

304318
$returnTag = $this->getReturnTag();
305319
if ($returnTag !== null) {
306-
$transformedType = TypeTraverser::map($returnTag->getType(), static function (Type $type, callable $traverse) use ($parameterNameMapping): Type {
307-
if ($type instanceof ConditionalTypeForParameter) {
308-
$parameterName = substr($type->getParameterName(), 1);
309-
if (array_key_exists($parameterName, $parameterNameMapping)) {
310-
$type = $type->changeParameterName('$' . $parameterNameMapping[$parameterName]);
311-
}
312-
}
313-
314-
return $traverse($type);
315-
});
320+
$transformedType = TypeTraverser::map($returnTag->getType(), $mapParameterCb);
316321
$returnTag = $returnTag->withType($transformedType);
317322
}
318323

0 commit comments

Comments
 (0)