/**
  * @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;
 }