/**
* @param ParamNode $node
* @param ReflectionFunctionAbstract $function
* @param int $parameterIndex
* @return ReflectionParameter
*/
public static function createFromNode(ParamNode $node, ReflectionFunctionAbstract $function, $parameterIndex)
{
$param = new self();
$param->name = $node->name;
$param->function = $function;
$param->isOptional = (bool) $node->isOptional;
$param->hasDefaultValue = null !== $node->default;
$param->isVariadic = (bool) $node->variadic;
$param->isByReference = (bool) $node->byRef;
$param->parameterIndex = (int) $parameterIndex;
$param->typeHint = (new FindTypeFromAst())->__invoke($node->type, $function->getLocatedSource(), $function instanceof ReflectionMethod ? $function->getDeclaringClass()->getNamespaceName() : $function->getNamespaceName());
if ($param->hasDefaultValue) {
$param->parseDefaultValueNode($node->default);
}
$param->docBlockTypes = (new FindParameterType())->__invoke($function, $node);
return $param;
}