From 8ae0b28a5c1e6f4e2c692caff0cd99df07f2486e Mon Sep 17 00:00:00 2001 From: Ondrej Mirtes Date: Wed, 3 Apr 2024 11:50:08 +0200 Subject: [PATCH] Fix conditional types in PHPDocs from stubs for native functions --- src/PhpDoc/ResolvedPhpDocBlock.php | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/PhpDoc/ResolvedPhpDocBlock.php b/src/PhpDoc/ResolvedPhpDocBlock.php index 8e7cfeff8d..62d6cbd958 100644 --- a/src/PhpDoc/ResolvedPhpDocBlock.php +++ b/src/PhpDoc/ResolvedPhpDocBlock.php @@ -281,6 +281,17 @@ public function changeParameterNamesByMapping(array $parameterNameMapping): self return $this; } + $mapParameterCb = static function (Type $type, callable $traverse) use ($parameterNameMapping): Type { + if ($type instanceof ConditionalTypeForParameter) { + $parameterName = substr($type->getParameterName(), 1); + if (array_key_exists($parameterName, $parameterNameMapping)) { + $type = $type->changeParameterName('$' . $parameterNameMapping[$parameterName]); + } + } + + return $traverse($type); + }; + $paramTags = $this->getParamTags(); $newParamTags = []; @@ -288,7 +299,8 @@ public function changeParameterNamesByMapping(array $parameterNameMapping): self if (!array_key_exists($key, $parameterNameMapping)) { continue; } - $newParamTags[$parameterNameMapping[$key]] = $paramTag; + $transformedType = TypeTraverser::map($paramTag->getType(), $mapParameterCb); + $newParamTags[$parameterNameMapping[$key]] = $paramTag->withType($transformedType); } $paramOutTags = $this->getParamOutTags(); @@ -298,21 +310,14 @@ public function changeParameterNamesByMapping(array $parameterNameMapping): self if (!array_key_exists($key, $parameterNameMapping)) { continue; } - $newParamOutTags[$parameterNameMapping[$key]] = $paramOutTag; + + $transformedType = TypeTraverser::map($paramOutTag->getType(), $mapParameterCb); + $newParamOutTags[$parameterNameMapping[$key]] = $paramOutTag->withType($transformedType); } $returnTag = $this->getReturnTag(); if ($returnTag !== null) { - $transformedType = TypeTraverser::map($returnTag->getType(), static function (Type $type, callable $traverse) use ($parameterNameMapping): Type { - if ($type instanceof ConditionalTypeForParameter) { - $parameterName = substr($type->getParameterName(), 1); - if (array_key_exists($parameterName, $parameterNameMapping)) { - $type = $type->changeParameterName('$' . $parameterNameMapping[$parameterName]); - } - } - - return $traverse($type); - }); + $transformedType = TypeTraverser::map($returnTag->getType(), $mapParameterCb); $returnTag = $returnTag->withType($transformedType); }