name = $reflectionObject->name; $this->isDeprecated = $reflectionObject->isDeprecated(); foreach ($reflectionObject->getParameters() as $parameter) { $this->parameters[] = (new PHPParameter())->readObjectFromReflection($parameter); } if (method_exists($reflectionObject, 'getReturnType')) { $returnTypes = self::getReflectionTypeAsArray($reflectionObject->getReturnType()); } if (!empty($returnTypes)) { array_push($this->returnTypesFromSignature, ...$returnTypes); } return $this; } /** * @param Function_ $node * @return static * @throws RuntimeException */ public function readObjectFromStubNode($node) { $functionName = self::getFQN($node); $this->name = $functionName; $typesFromAttribute = self::findTypesFromAttribute($node->attrGroups); $this->availableVersionsRangeFromAttribute = self::findAvailableVersionsRangeFromAttribute($node->attrGroups); $this->returnTypesFromAttribute = $typesFromAttribute; array_push($this->returnTypesFromSignature, ...self::convertParsedTypeToArray($node->getReturnType())); $index = 0; foreach ($node->getParams() as $parameter) { $parsedParameter = (new PHPParameter())->readObjectFromStubNode($parameter); if (self::entitySuitsCurrentPhpVersion($parsedParameter)) { $parsedParameter->indexInSignature = $index; $addedParameters = array_filter($this->parameters, function (PHPParameter $addedParameter) use ($parsedParameter) { return $addedParameter->name === $parsedParameter->name; }); if (!empty($addedParameters)) { if ($parsedParameter->is_vararg) { $parsedParameter->isOptional = false; $index--; $parsedParameter->indexInSignature = $index; } } $this->parameters[$parsedParameter->name] = $parsedParameter; $index++; } } $this->collectTags($node); foreach ($this->parameters as $parameter) { $relatedParamTags = array_filter($this->paramTags, function (Param $tag) use ($parameter) { return $tag->getVariableName() === $parameter->name; }); /** @var Param $relatedParamTag */ $relatedParamTag = array_pop($relatedParamTags); if ($relatedParamTag !== null) { $parameter->isOptional = $parameter->isOptional || str_contains((string)$relatedParamTag->getDescription(), '[optional]'); } } $this->checkDeprecationTag($node); $this->checkReturnTag(); return $this; } protected function checkDeprecationTag(FunctionLike $node) { $this->isDeprecated = self::hasDeprecatedAttribute($node) || !empty($this->deprecatedTags); } protected function checkReturnTag() { if (!empty($this->returnTags) && $this->returnTags[0] instanceof Return_) { $returnType = $this->returnTags[0]->getType(); if ($returnType instanceof Compound) { foreach ($returnType as $nextType) { $this->returnTypesFromPhpDoc[] = (string)$nextType; } } else { $this->returnTypesFromPhpDoc[] = (string)$returnType; } } } /** * @param stdClass|array $jsonData * @throws Exception */ public function readMutedProblems($jsonData) { foreach ($jsonData as $function) { if ($function->name === $this->name) { if (!empty($function->problems)) { foreach ($function->problems as $problem) { switch ($problem->description) { case 'parameter mismatch': $this->mutedProblems[StubProblemType::FUNCTION_PARAMETER_MISMATCH] = $problem->versions; break; case 'missing function': $this->mutedProblems[StubProblemType::STUB_IS_MISSED] = $problem->versions; break; case 'deprecated function': $this->mutedProblems[StubProblemType::FUNCTION_IS_DEPRECATED] = $problem->versions; break; case 'absent in meta': $this->mutedProblems[StubProblemType::ABSENT_IN_META] = $problem->versions; break; case 'has return typehint': $this->mutedProblems[StubProblemType::FUNCTION_HAS_RETURN_TYPEHINT] = $problem->versions; break; case 'wrong return typehint': $this->mutedProblems[StubProblemType::WRONG_RETURN_TYPEHINT] = $problem->versions; break; case 'has duplicate in stubs': $this->mutedProblems[StubProblemType::HAS_DUPLICATION] = $problem->versions; break; case 'has type mismatch in signature and phpdoc': $this->mutedProblems[StubProblemType::TYPE_IN_PHPDOC_DIFFERS_FROM_SIGNATURE] = $problem->versions; break; default: throw new Exception("Unexpected value $problem->description"); } } } if (!empty($function->parameters)) { foreach ($this->parameters as $parameter) { $parameter->readMutedProblems($function->parameters); } } } } } /** * @param FunctionLike $node * @return bool */ private static function hasDeprecatedAttribute(FunctionLike $node) { foreach ($node->getAttrGroups() as $group) { foreach ($group->attrs as $attr) { if ((string)$attr->name === Deprecated::class) { return true; } } } return false; } /** * @param Doc|null $docComment * @return bool */ private static function hasDeprecatedDocTag($docComment) { $phpDoc = $docComment !== null ? DocFactoryProvider::getDocFactory()->create($docComment->getText()) : null; return $phpDoc !== null && !empty($phpDoc->getTagsByName('deprecated')); } } __halt_compiler();----SIGNATURE:----q+0Im51PZnthwu64prjE/JRzVE1ON/LW+H7awZguCbMhUL1XAGNnH4IvEw35ZQOjhkms4ZLCBnq+iMNG5M1OxcgaW6AzKQDw4GKhNDccSFkwAz4WV45/yiQxB8GgR9fA7q3DlYqQnKMt95gNp9BYXArIYS+ASDvG7NKqA1KURSnSvCURXmcpYSxBJHL7EMPcu1uXlT07OA0RmgrJ0bVdpPd5L5n4+kwdBgFGXebD0hNN7jOweEfANrIxgOZu67l/2v4bebmCBUgNPrqrgaGVBUyNsJRY6SrXsnEFoAeXPxGZuYMUsqH1mxezET6S9PXz6nNDk3+8EqVMMmE0bs0nM9DlLK7JryPJF/e0JvrOkyaBXIEhSay5mggTeYtMu4rBxENuqJzf5hdvAzC55G6nTKPtXMEPipAU88o16geBOL7tbcwq0TjrlNiFkqv3uu6gOvqka+Xjxqo8iumEQ1rZQIHN/FbTRkAC5029CT/R+5tvpU7tgrFqKsGtBwaZFQAisanosM6/h9F2FZNtrQ7mS60bq9iNRTlLHZNDqZUddziRWY9Wn0bhK7rLUEG0sQQXy1xsxOTz3byWsxUu0fx/px7NXcOVaWv2DvhSg29SUReAKUzcejGobLROQ3XEVsP8W6Sz22+P6yGOYuS3ZGmhJEN7wcUUHMRxJuaD0UEJ6UM=----ATTACHMENT:----MTg1MDQ5OTQ1MjU3ODEzNSA3MjUxNzgyMjMyMDQ4NjgwIDE1MTU5Njk0MTQ1MTkyODM=