getParameters())), self::type($reflection->getReturnType()) ); } /** "function", or a method's visibility and "static" – a method that turns private or non-static breaks a call. */ private static function kind(ReflectionFunctionAbstract $reflection): string { if (! $reflection instanceof ReflectionMethod) { return 'function'; } $visibility = $reflection->isPublic() ? 'public' : ($reflection->isProtected() ? 'protected' : 'private'); return $reflection->isStatic() ? $visibility . ' static' : $visibility; } /** @throws ReflectionException */ private static function reflect(Call $call): ?ReflectionFunctionAbstract { $class = $call->className(); if ($class === null) { return function_exists($call->member()) ? new ReflectionFunction($call->member()) : null; } return method_exists($class, $call->member()) ? new ReflectionMethod($class, $call->member()) : null; } private static function parameter(ReflectionParameter $parameter): string { return ($parameter->isPassedByReference() ? '&' : '') . ($parameter->isVariadic() ? '...' : '') . self::type($parameter->getType()) . ($parameter->isOptional() && ! $parameter->isVariadic() ? '=' : ''); } private static function type(?ReflectionType $type): string { return $type === null ? 'mixed' : (string) $type; } }