public function getPossibleCalls(ReflectionParameter ...$params) : array
    {
        if (!count($params)) {
            return [[]];
        }
        $options = [];
        $opts = [];
        $annotations = new Annotations($this);
        foreach ($params as $i => $param) {
            if (!$param->hasType()) {
                if (isset($annotations['param'][$i])) {
                    if (is_string($annotations['param']) && $i === 0) {
                        $opts[] = $this->extractTypeFromAnnotation($annotations['param']);
                    } else {
                        $opts[] = $this->extractTypeFromAnnotation($annotations['param'][$i]);
                    }
                } else {
                    $opts[] = 'mixed';
                }
            } else {
                $opts[] = $param->getType()->__toString();
            }
        }
        $options[] = $opts;
        $last = array_pop($params);
        if ($last->isOptional() && !$last->isVariadic()) {
            $options = array_merge($options, $this->getPossibleCalls(...$params));
        }
        return $options;
    }