Finalize documentation
This commit is contained in:
parent
3d956b9002
commit
f4cb2d83a1
|
@ -57,7 +57,8 @@
|
||||||
"danog/7to5": "^1",
|
"danog/7to5": "^1",
|
||||||
"vimeo/psalm": "dev-master",
|
"vimeo/psalm": "dev-master",
|
||||||
"phpstan/phpstan": "^0.12.14",
|
"phpstan/phpstan": "^0.12.14",
|
||||||
"friendsofphp/php-cs-fixer": "^2"
|
"friendsofphp/php-cs-fixer": "dev-master",
|
||||||
|
"danog/phpdoc": "^0.1"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"ext-libtgvoip": "Install the php-libtgvoip extension to make phone calls (https://github.com/danog/php-libtgvoip)"
|
"ext-libtgvoip": "Install the php-libtgvoip extension to make phone calls (https://github.com/danog/php-libtgvoip)"
|
||||||
|
@ -97,9 +98,14 @@
|
||||||
],
|
],
|
||||||
"build": [
|
"build": [
|
||||||
"@docs",
|
"@docs",
|
||||||
|
"@phpdocs",
|
||||||
"@cs-fix",
|
"@cs-fix",
|
||||||
"@psalm"
|
"@psalm"
|
||||||
],
|
],
|
||||||
|
"phpdocs": [
|
||||||
|
"@phpdocsInternal",
|
||||||
|
"@phpdocsMain"
|
||||||
|
],
|
||||||
"check": [
|
"check": [
|
||||||
"@cs",
|
"@cs",
|
||||||
"@test"
|
"@test"
|
||||||
|
@ -109,6 +115,8 @@
|
||||||
"cs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff --dry-run",
|
"cs": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff --dry-run",
|
||||||
"cs-fix": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff",
|
"cs-fix": "PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix -v --diff",
|
||||||
"psalm": "psalm",
|
"psalm": "psalm",
|
||||||
|
"phpdocsMain": "php tools/phpdoc.php",
|
||||||
|
"phpdocsInternal": "phpdoc docs/docs/PHPInternal",
|
||||||
"docs": "php tools/build_docs.php",
|
"docs": "php tools/build_docs.php",
|
||||||
"test": "@php -dzend.assertions=1 -dassert.exception=1 ./vendor/bin/phpunit --coverage-text --config tests/phpunit.xml"
|
"test": "@php -dzend.assertions=1 -dassert.exception=1 ./vendor/bin/phpunit --coverage-text --config tests/phpunit.xml"
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,60 @@ use danog\MadelineProto\Settings\Logger as SettingsLogger;
|
||||||
*/
|
*/
|
||||||
class API extends InternalDoc
|
class API extends InternalDoc
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Release version.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
const RELEASE = MTProto::RELEASE;
|
||||||
|
/**
|
||||||
|
* We're not logged in.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const NOT_LOGGED_IN = MTProto::NOT_LOGGED_IN;
|
||||||
|
/**
|
||||||
|
* We're waiting for the login code.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const WAITING_CODE = MTProto::WAITING_CODE;
|
||||||
|
/**
|
||||||
|
* We're waiting for parameters to sign up.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const WAITING_SIGNUP = MTProto::WAITING_SIGNUP;
|
||||||
|
/**
|
||||||
|
* We're waiting for the 2FA password.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const WAITING_PASSWORD = MTProto::WAITING_PASSWORD;
|
||||||
|
/**
|
||||||
|
* We're logged in.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const LOGGED_IN = MTProto::LOGGED_IN;
|
||||||
|
/**
|
||||||
|
* Secret chat was not found.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const SECRET_EMPTY = MTProto::SECRET_EMPTY;
|
||||||
|
/**
|
||||||
|
* Secret chat was requested.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const SECRET_REQUESTED = MTProto::SECRET_REQUESTED;
|
||||||
|
/**
|
||||||
|
* Secret chat was found.
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
const SECRET_READY = MTProto::SECRET_READY;
|
||||||
use \danog\Serializable;
|
use \danog\Serializable;
|
||||||
use \danog\MadelineProto\ApiWrappers\Start;
|
use \danog\MadelineProto\ApiWrappers\Start;
|
||||||
use \danog\MadelineProto\ApiWrappers\Templates;
|
use \danog\MadelineProto\ApiWrappers\Templates;
|
||||||
|
|
|
@ -314,6 +314,8 @@ class AnnotationsBuilder
|
||||||
$promise = '\\'.Promise::class;
|
$promise = '\\'.Promise::class;
|
||||||
$phpdoc = $method->getDocComment() ?? '';
|
$phpdoc = $method->getDocComment() ?? '';
|
||||||
$phpdoc = \str_replace("@return \\Generator", "@return $promise", $phpdoc);
|
$phpdoc = \str_replace("@return \\Generator", "@return $promise", $phpdoc);
|
||||||
|
$phpdoc = \str_replace("@return \\Promise", "@return $promise", $phpdoc);
|
||||||
|
$phpdoc = \str_replace("@return Promise", "@return $promise", $phpdoc);
|
||||||
if ($hasReturnValue && $async && \preg_match("/@return (.*)/", $phpdoc, $matches)) {
|
if ($hasReturnValue && $async && \preg_match("/@return (.*)/", $phpdoc, $matches)) {
|
||||||
$ret = $matches[1];
|
$ret = $matches[1];
|
||||||
$new = $ret;
|
$new = $ret;
|
||||||
|
|
|
@ -15,7 +15,7 @@ interface DbArray extends DbType, \ArrayAccess, \Countable
|
||||||
/**
|
/**
|
||||||
* Get Array copy.
|
* Get Array copy.
|
||||||
*
|
*
|
||||||
* @psalm-return Promise<array<string|int, T>> $value
|
* @psalm-return Promise<array<string|int, T>>
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return Promise
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -4529,7 +4529,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @psalm-suppress InvalidScope
|
* @psalm-suppress InvalidScope
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function after($a, $b)
|
public function after($a, $b)
|
||||||
{
|
{
|
||||||
|
@ -4541,7 +4541,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<\Generator|Promise> $promises Promises
|
* @param array<\Generator|Promise> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function all(array $promises)
|
public function all(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -4552,7 +4552,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function any(array $promises)
|
public function any(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -4621,7 +4621,7 @@ class InternalDoc extends APIFactory
|
||||||
* @template TReturn
|
* @template TReturn
|
||||||
* @psalm-param \Generator<mixed, mixed, mixed, TReturn>|Promise<TReturn>|TReturn $promise
|
* @psalm-param \Generator<mixed, mixed, mixed, TReturn>|Promise<TReturn>|TReturn $promise
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
* @psalm-return Promise<TReturn>
|
* @psalm-return Promise<TReturn>
|
||||||
*/
|
*/
|
||||||
public function call($promise)
|
public function call($promise)
|
||||||
|
@ -4637,7 +4637,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @psalm-suppress InvalidScope
|
* @psalm-suppress InvalidScope
|
||||||
*
|
*
|
||||||
* @return Promise|mixed
|
* @return \Amp\Promise|mixed
|
||||||
*/
|
*/
|
||||||
public function callFork($promise, $actual = null, $file = '')
|
public function callFork($promise, $actual = null, $file = '')
|
||||||
{
|
{
|
||||||
|
@ -4904,7 +4904,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param string $string Message to echo
|
* @param string $string Message to echo
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function echo(string $string)
|
public function echo(string $string)
|
||||||
{
|
{
|
||||||
|
@ -4961,7 +4961,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function first(array $promises)
|
public function first(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -4977,7 +4977,7 @@ class InternalDoc extends APIFactory
|
||||||
* @param ?Promise $token Cancellation token
|
* @param ?Promise $token Cancellation token
|
||||||
* @param ?callable $failureCb Failure callback, called only once if the first locking attempt fails.
|
* @param ?callable $failureCb Failure callback, called only once if the first locking attempt fails.
|
||||||
*
|
*
|
||||||
* @return Promise<?callable>
|
* @return \Amp\Promise<?callable>
|
||||||
*/
|
*/
|
||||||
public function flock(string $file, int $operation, float $polling = 0.1, ?\Amp\Promise $token = null, $failureCb = null)
|
public function flock(string $file, int $operation, float $polling = 0.1, ?\Amp\Promise $token = null, $failureCb = null)
|
||||||
{
|
{
|
||||||
|
@ -5284,8 +5284,8 @@ class InternalDoc extends APIFactory
|
||||||
* user_id?: int,
|
* user_id?: int,
|
||||||
* chat_id?: int,
|
* chat_id?: int,
|
||||||
* channel_id?: int,
|
* channel_id?: int,
|
||||||
* InputUser?: {_: string, user_id?: int, access_hash?: mixed, min?: bool},
|
* InputUser?: array{_: string, user_id?: int, access_hash?: mixed, min?: bool},
|
||||||
* InputChannel?: {_: string, channel_id: int, access_hash: mixed, min: bool},
|
* InputChannel?: array{_: string, channel_id: int, access_hash: mixed, min: bool},
|
||||||
* type: string
|
* type: string
|
||||||
* }>
|
* }>
|
||||||
*/
|
*/
|
||||||
|
@ -5624,7 +5624,7 @@ class InternalDoc extends APIFactory
|
||||||
/**
|
/**
|
||||||
* Start MadelineProto's update handling loop in background.
|
* Start MadelineProto's update handling loop in background.
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function loopFork(array $extra = [])
|
public function loopFork(array $extra = [])
|
||||||
{
|
{
|
||||||
|
@ -5835,7 +5835,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param string $prompt Prompt
|
* @param string $prompt Prompt
|
||||||
*
|
*
|
||||||
* @return Promise<string>
|
* @return \Amp\Promise<string>
|
||||||
*/
|
*/
|
||||||
public function readLine(string $prompt = '')
|
public function readLine(string $prompt = '')
|
||||||
{
|
{
|
||||||
|
@ -6076,7 +6076,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param int|float $time Number of seconds to sleep for
|
* @param int|float $time Number of seconds to sleep for
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function sleep($time)
|
public function sleep($time)
|
||||||
{
|
{
|
||||||
|
@ -6088,7 +6088,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function some(array $promises)
|
public function some(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -6153,7 +6153,7 @@ class InternalDoc extends APIFactory
|
||||||
* @param \Generator|Promise $promise
|
* @param \Generator|Promise $promise
|
||||||
* @param integer $timeout
|
* @param integer $timeout
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function timeout($promise, int $timeout)
|
public function timeout($promise, int $timeout)
|
||||||
{
|
{
|
||||||
|
@ -6177,7 +6177,7 @@ class InternalDoc extends APIFactory
|
||||||
* @psalm-param Promise<TReturn>|TGenerator $promise Promise to which the timeout is applied.
|
* @psalm-param Promise<TReturn>|TGenerator $promise Promise to which the timeout is applied.
|
||||||
* @psalm-param TReturnAlt $default
|
* @psalm-param TReturnAlt $default
|
||||||
*
|
*
|
||||||
* @return Promise<TReturn>|Promise<TReturnAlt>
|
* @return \Amp\Promise<TReturn>|Promise<TReturnAlt>
|
||||||
*
|
*
|
||||||
* @throws \TypeError If $promise is not an instance of \Amp\Promise, \Generator or \React\Promise\PromiseInterface.
|
* @throws \TypeError If $promise is not an instance of \Amp\Promise, \Generator or \React\Promise\PromiseInterface.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -33,9 +33,21 @@ use function Amp\ByteStream\getStdout;
|
||||||
*/
|
*/
|
||||||
class Logger
|
class Logger
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @internal ANSI foreground color escapes
|
||||||
|
*/
|
||||||
const FOREGROUND = ['default' => 39, 'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'light_gray' => 37, 'dark_gray' => 90, 'light_red' => 91, 'light_green' => 92, 'light_yellow' => 93, 'light_blue' => 94, 'light_magenta' => 95, 'light_cyan' => 96, 'white' => 97];
|
const FOREGROUND = ['default' => 39, 'black' => 30, 'red' => 31, 'green' => 32, 'yellow' => 33, 'blue' => 34, 'magenta' => 35, 'cyan' => 36, 'light_gray' => 37, 'dark_gray' => 90, 'light_red' => 91, 'light_green' => 92, 'light_yellow' => 93, 'light_blue' => 94, 'light_magenta' => 95, 'light_cyan' => 96, 'white' => 97];
|
||||||
|
/**
|
||||||
|
* @internal ANSI background color escapes
|
||||||
|
*/
|
||||||
const BACKGROUND = ['default' => 49, 'black' => 40, 'red' => 41, 'magenta' => 45, 'yellow' => 43, 'green' => 42, 'blue' => 44, 'cyan' => 46, 'light_gray' => 47, 'dark_gray' => 100, 'light_red' => 101, 'light_green' => 102, 'light_yellow' => 103, 'light_blue' => 104, 'light_magenta' => 105, 'light_cyan' => 106, 'white' => 107];
|
const BACKGROUND = ['default' => 49, 'black' => 40, 'red' => 41, 'magenta' => 45, 'yellow' => 43, 'green' => 42, 'blue' => 44, 'cyan' => 46, 'light_gray' => 47, 'dark_gray' => 100, 'light_red' => 101, 'light_green' => 102, 'light_yellow' => 103, 'light_blue' => 104, 'light_magenta' => 105, 'light_cyan' => 106, 'white' => 107];
|
||||||
|
/**
|
||||||
|
* @internal ANSI modifier escapes
|
||||||
|
*/
|
||||||
const SET = ['bold' => 1, 'dim' => 2, 'underlined' => 3, 'blink' => 4, 'reverse' => 5, 'hidden' => 6];
|
const SET = ['bold' => 1, 'dim' => 2, 'underlined' => 3, 'blink' => 4, 'reverse' => 5, 'hidden' => 6];
|
||||||
|
/**
|
||||||
|
* @internal ANSI reset modifier escapes
|
||||||
|
*/
|
||||||
const RESET = ['all' => 0, 'bold' => 21, 'dim' => 22, 'underlined' => 24, 'blink' => 25, 'reverse' => 26, 'hidden' => 28];
|
const RESET = ['all' => 0, 'bold' => 21, 'dim' => 22, 'underlined' => 24, 'blink' => 25, 'reverse' => 26, 'hidden' => 28];
|
||||||
/**
|
/**
|
||||||
* Logging mode.
|
* Logging mode.
|
||||||
|
@ -101,61 +113,115 @@ class Logger
|
||||||
private PsrLogger $psr;
|
private PsrLogger $psr;
|
||||||
/**
|
/**
|
||||||
* Ultra verbose logging.
|
* Ultra verbose logging.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const ULTRA_VERBOSE = 5;
|
const ULTRA_VERBOSE = 5;
|
||||||
/**
|
/**
|
||||||
* Verbose logging.
|
* Verbose logging.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const VERBOSE = 4;
|
const VERBOSE = 4;
|
||||||
/**
|
/**
|
||||||
* Notice logging.
|
* Notice logging.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const NOTICE = 3;
|
const NOTICE = 3;
|
||||||
/**
|
/**
|
||||||
* Warning logging.
|
* Warning logging.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const WARNING = 2;
|
const WARNING = 2;
|
||||||
/**
|
/**
|
||||||
* Error logging.
|
* Error logging.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const ERROR = 1;
|
const ERROR = 1;
|
||||||
/**
|
/**
|
||||||
* Log only fatal errors.
|
* Log only fatal errors.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const FATAL_ERROR = 0;
|
const FATAL_ERROR = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disable logger (DEPRECATED).
|
* Disable logger (DEPRECATED).
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
* @deprecated
|
||||||
*/
|
*/
|
||||||
const NO_LOGGER = 0;
|
const NO_LOGGER = 0;
|
||||||
/**
|
/**
|
||||||
* Default logger (syslog).
|
* Default logger (syslog).
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const DEFAULT_LOGGER = 1;
|
const DEFAULT_LOGGER = 1;
|
||||||
/**
|
/**
|
||||||
* File logger.
|
* File logger.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const FILE_LOGGER = 2;
|
const FILE_LOGGER = 2;
|
||||||
/**
|
/**
|
||||||
* Echo logger.
|
* Echo logger.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const ECHO_LOGGER = 3;
|
const ECHO_LOGGER = 3;
|
||||||
/**
|
/**
|
||||||
* Callable logger.
|
* Callable logger.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
*/
|
*/
|
||||||
const CALLABLE_LOGGER = 4;
|
const CALLABLE_LOGGER = 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ultra verbose level.
|
||||||
|
*/
|
||||||
const LEVEL_ULTRA_VERBOSE = self::ULTRA_VERBOSE;
|
const LEVEL_ULTRA_VERBOSE = self::ULTRA_VERBOSE;
|
||||||
|
/**
|
||||||
|
* Verbose level.
|
||||||
|
*/
|
||||||
const LEVEL_VERBOSE = self::VERBOSE;
|
const LEVEL_VERBOSE = self::VERBOSE;
|
||||||
|
/**
|
||||||
|
* Notice level.
|
||||||
|
*/
|
||||||
const LEVEL_NOTICE = self::NOTICE;
|
const LEVEL_NOTICE = self::NOTICE;
|
||||||
|
/**
|
||||||
|
* Warning level.
|
||||||
|
*/
|
||||||
const LEVEL_WARNING = self::WARNING;
|
const LEVEL_WARNING = self::WARNING;
|
||||||
|
/**
|
||||||
|
* Error level.
|
||||||
|
*/
|
||||||
const LEVEL_ERROR = self::ERROR;
|
const LEVEL_ERROR = self::ERROR;
|
||||||
|
/**
|
||||||
|
* Fatal error level.
|
||||||
|
*/
|
||||||
const LEVEL_FATAL = self::FATAL_ERROR;
|
const LEVEL_FATAL = self::FATAL_ERROR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default logger (syslog).
|
||||||
|
*/
|
||||||
const LOGGER_DEFAULT = self::DEFAULT_LOGGER;
|
const LOGGER_DEFAULT = self::DEFAULT_LOGGER;
|
||||||
|
/**
|
||||||
|
* Echo logger.
|
||||||
|
*/
|
||||||
const LOGGER_ECHO = self::ECHO_LOGGER;
|
const LOGGER_ECHO = self::ECHO_LOGGER;
|
||||||
|
/**
|
||||||
|
* File logger.
|
||||||
|
*/
|
||||||
const LOGGER_FILE = self::FILE_LOGGER;
|
const LOGGER_FILE = self::FILE_LOGGER;
|
||||||
|
/**
|
||||||
|
* Callable logger.
|
||||||
|
*/
|
||||||
const LOGGER_CALLABLE = self::CALLABLE_LOGGER;
|
const LOGGER_CALLABLE = self::CALLABLE_LOGGER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct global static logger from MadelineProto settings.
|
* Construct global static logger from MadelineProto settings.
|
||||||
*
|
*
|
||||||
|
|
|
@ -95,6 +95,8 @@ class MTProto extends AsyncConstruct implements TLCallback
|
||||||
*
|
*
|
||||||
* Increased every time the default settings array or something big changes
|
* Increased every time the default settings array or something big changes
|
||||||
*
|
*
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
* @var int
|
* @var int
|
||||||
*/
|
*/
|
||||||
const V = 147;
|
const V = 147;
|
||||||
|
|
|
@ -202,7 +202,8 @@ class MinDatabase implements TLCallback
|
||||||
*
|
*
|
||||||
* @param float|int $id Peer ID
|
* @param float|int $id Peer ID
|
||||||
*
|
*
|
||||||
* @return boolean<Promise>
|
* @return Promise
|
||||||
|
* @psalm-return Promise<bool>
|
||||||
*/
|
*/
|
||||||
public function hasPeer($id): Promise
|
public function hasPeer($id): Promise
|
||||||
{
|
{
|
||||||
|
|
|
@ -489,8 +489,8 @@ trait PeerHandler
|
||||||
* user_id?: int,
|
* user_id?: int,
|
||||||
* chat_id?: int,
|
* chat_id?: int,
|
||||||
* channel_id?: int,
|
* channel_id?: int,
|
||||||
* InputUser?: {_: string, user_id?: int, access_hash?: mixed, min?: bool},
|
* InputUser?: array{_: string, user_id?: int, access_hash?: mixed, min?: bool},
|
||||||
* InputChannel?: {_: string, channel_id: int, access_hash: mixed, min: bool},
|
* InputChannel?: array{_: string, channel_id: int, access_hash: mixed, min: bool},
|
||||||
* type: string
|
* type: string
|
||||||
* }>
|
* }>
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace danog\MadelineProto\PhpDoc;
|
|
||||||
|
|
||||||
use danog\MadelineProto\Logger;
|
|
||||||
use danog\MadelineProto\PhpDocBuilder;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\InvalidTag;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Property;
|
|
||||||
use ReflectionClass;
|
|
||||||
use ReflectionClassConstant;
|
|
||||||
use ReflectionMethod;
|
|
||||||
|
|
||||||
class ClassDoc extends GenericDoc
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Properties.
|
|
||||||
*
|
|
||||||
* @var array<string, array>
|
|
||||||
*/
|
|
||||||
private array $properties = [];
|
|
||||||
/**
|
|
||||||
* Methods.
|
|
||||||
*
|
|
||||||
* @var array<string, MethodDoc>
|
|
||||||
*/
|
|
||||||
private array $methods = [];
|
|
||||||
/**
|
|
||||||
* Constants.
|
|
||||||
*/
|
|
||||||
private array $constants = [];
|
|
||||||
public function __construct(PhpDocBuilder $builder, ReflectionClass $reflectionClass)
|
|
||||||
{
|
|
||||||
$this->builder = $builder;
|
|
||||||
$this->name = $reflectionClass->getName();
|
|
||||||
$doc = $reflectionClass->getDocComment();
|
|
||||||
if (!$doc) {
|
|
||||||
Logger::log($reflectionClass->getName()." has no PHPDOC");
|
|
||||||
$this->ignore = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$doc = $this->builder->getFactory()->create($doc);
|
|
||||||
|
|
||||||
parent::__construct($doc, $reflectionClass);
|
|
||||||
|
|
||||||
$tags = $doc->getTags();
|
|
||||||
foreach ($tags as $tag) {
|
|
||||||
if ($tag instanceof Property) {
|
|
||||||
$this->properties[$tag->getVariableName()] = [
|
|
||||||
$tag->getType(),
|
|
||||||
$tag->getDescription()
|
|
||||||
];
|
|
||||||
}
|
|
||||||
if ($tag instanceof InvalidTag && $tag->getName() === 'property') {
|
|
||||||
[$type, $description] = \explode(" $", $tag->render(), 2);
|
|
||||||
$description .= ' ';
|
|
||||||
[$varName, $description] = \explode(" ", $description, 2);
|
|
||||||
$type = \str_replace('@property ', '', $type);
|
|
||||||
$description ??= '';
|
|
||||||
$this->properties[$varName] = [
|
|
||||||
$type,
|
|
||||||
$description
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ($reflectionClass->getConstants() as $key => $value) {
|
|
||||||
$refl = new ReflectionClassConstant($reflectionClass->getName(), $key);
|
|
||||||
if (!$refl->isPublic()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$description = '';
|
|
||||||
if ($refl->getDocComment()) {
|
|
||||||
$docConst = $this->builder->getFactory()->create($refl->getDocComment());
|
|
||||||
if ($this->builder->shouldIgnore($refl->getDeclaringClass()->getName())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$description .= $docConst->getSummary();
|
|
||||||
if ($docConst->getDescription()) {
|
|
||||||
$description .= "\n\n";
|
|
||||||
$description .= $docConst->getDescription();
|
|
||||||
}
|
|
||||||
if ($docConst->getTagsByName('internal')) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$description = \trim($description);
|
|
||||||
$this->constants[$key] = [
|
|
||||||
$value,
|
|
||||||
$description
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
|
|
||||||
if (str_starts_with($method->getName(), '__') && $method !== '__construct') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$this->methods[$method->getName()] = new MethodDoc($this->builder, $method);
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->methods = \array_filter($this->methods, fn (MethodDoc $doc): bool => !$doc->shouldIgnore());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function format(): string
|
|
||||||
{
|
|
||||||
$init = parent::format();
|
|
||||||
if ($this->constants) {
|
|
||||||
$init .= "\n";
|
|
||||||
$init .= "## Constants\n";
|
|
||||||
foreach ($this->constants as $name => [, $description]) {
|
|
||||||
$description = \trim($description);
|
|
||||||
$description = \str_replace("\n", "\n ", $description);
|
|
||||||
$init .= "* {$this->className}::$name: $description\n";
|
|
||||||
$init .= "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($this->methods) {
|
|
||||||
$init .= "\n";
|
|
||||||
$init .= "## Method list:\n";
|
|
||||||
foreach ($this->methods as $method) {
|
|
||||||
$init .= "* `".$method->getSignature()."`\n";
|
|
||||||
}
|
|
||||||
$init .= "\n";
|
|
||||||
$init .= "## Methods:\n";
|
|
||||||
foreach ($this->methods as $method) {
|
|
||||||
$init .= $method->format();
|
|
||||||
$init .= "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($this->properties) {
|
|
||||||
$init .= "## Properties\n";
|
|
||||||
foreach ($this->properties as $name => [$type, $description]) {
|
|
||||||
$init .= "* `\$$name`: `$type` $description";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $init;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace danog\MadelineProto\PhpDoc;
|
|
||||||
|
|
||||||
use danog\MadelineProto\Logger;
|
|
||||||
use danog\MadelineProto\PhpDocBuilder;
|
|
||||||
use ReflectionFunction;
|
|
||||||
|
|
||||||
class FunctionDoc extends MethodDoc
|
|
||||||
{
|
|
||||||
public function __construct(PhpDocBuilder $builder, ReflectionFunction $reflectionClass)
|
|
||||||
{
|
|
||||||
$this->builder = $builder;
|
|
||||||
$this->nameGenericDoc = $reflectionClass->getName();
|
|
||||||
$doc = $reflectionClass->getDocComment();
|
|
||||||
if (!$doc) {
|
|
||||||
Logger::log($reflectionClass->getName()." has no PHPDOC");
|
|
||||||
$this->ignore = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$doc = $this->builder->getFactory()->create($doc);
|
|
||||||
|
|
||||||
parent::__construct($builder, $reflectionClass);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,148 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace danog\MadelineProto\PhpDoc;
|
|
||||||
|
|
||||||
use danog\MadelineProto\PhpDocBuilder;
|
|
||||||
use phpDocumentor\Reflection\DocBlock;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Description;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Author;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Deprecated;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Generic;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Reference\Url;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\See;
|
|
||||||
|
|
||||||
abstract class GenericDoc
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Builder instance.
|
|
||||||
*/
|
|
||||||
protected PhpDocBuilder $builder;
|
|
||||||
/**
|
|
||||||
* Name.
|
|
||||||
*/
|
|
||||||
protected string $name;
|
|
||||||
/**
|
|
||||||
* Title.
|
|
||||||
*/
|
|
||||||
protected string $title;
|
|
||||||
/**
|
|
||||||
* Description.
|
|
||||||
*/
|
|
||||||
protected Description $description;
|
|
||||||
/**
|
|
||||||
* See also array.
|
|
||||||
*
|
|
||||||
* @var array<string, See>
|
|
||||||
*/
|
|
||||||
protected array $seeAlso = [];
|
|
||||||
/**
|
|
||||||
* Authors.
|
|
||||||
*
|
|
||||||
* @var Author[]
|
|
||||||
*/
|
|
||||||
protected array $authors;
|
|
||||||
/**
|
|
||||||
* Ignore this class.
|
|
||||||
*/
|
|
||||||
protected bool $ignore = false;
|
|
||||||
/**
|
|
||||||
* Class name.
|
|
||||||
*/
|
|
||||||
protected string $className;
|
|
||||||
/**
|
|
||||||
* Class namespace.
|
|
||||||
*/
|
|
||||||
protected string $namespace;
|
|
||||||
public function __construct(DocBlock $doc, $reflectionClass)
|
|
||||||
{
|
|
||||||
$this->className = $reflectionClass->getName();
|
|
||||||
$this->namespace = \str_replace('/', '\\', \dirname(\str_replace('\\', '/', $this->className)));
|
|
||||||
$this->title = $doc->getSummary();
|
|
||||||
$this->description = $doc->getDescription();
|
|
||||||
$tags = $doc->getTags();
|
|
||||||
|
|
||||||
$this->authors = $this->builder->getAuthors();
|
|
||||||
foreach ($tags as $tag) {
|
|
||||||
if ($tag instanceof Author) {
|
|
||||||
$this->authors []= $tag;
|
|
||||||
}
|
|
||||||
if ($tag instanceof Deprecated) {
|
|
||||||
$this->ignore = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ($tag instanceof Generic && $tag->getName() === 'internal') {
|
|
||||||
$this->ignore = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if ($tag instanceof See) {
|
|
||||||
$this->seeAlso[$tag->getReference()->__toString()] = $tag;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function seeAlso(): string
|
|
||||||
{
|
|
||||||
$seeAlso = '';
|
|
||||||
foreach ($this->seeAlso as $see) {
|
|
||||||
$ref = $see->getReference();
|
|
||||||
if ($ref instanceof Fqsen) {
|
|
||||||
$ref = (string) $ref;
|
|
||||||
$ref = $this->builder->resolveTypeAlias($this->className, $ref);
|
|
||||||
$refExpl = \explode("\\", $ref);
|
|
||||||
$name = \array_pop($refExpl);
|
|
||||||
$namespace = \explode('/', $this->namespace);
|
|
||||||
$count = \count($refExpl);
|
|
||||||
foreach ($namespace as $k => $name) {
|
|
||||||
if (isset($refExpl[$k]) && $refExpl[$k] === $name) {
|
|
||||||
$count--;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ref = \str_repeat('../', $count)
|
|
||||||
.\implode('/', \array_slice($refExpl, $count))
|
|
||||||
."/$name.md";
|
|
||||||
|
|
||||||
$desc = $see->getDescription() ?: $ref;
|
|
||||||
$seeAlso .= "* [$desc]($ref)\n";
|
|
||||||
}
|
|
||||||
if ($ref instanceof Url) {
|
|
||||||
$desc = $see->getDescription() ?: $ref;
|
|
||||||
$seeAlso .= "* [$desc]($ref)\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($seeAlso) {
|
|
||||||
$seeAlso = "\n#### See also: \n$seeAlso\n\n";
|
|
||||||
}
|
|
||||||
return $seeAlso;
|
|
||||||
}
|
|
||||||
public function format(): string
|
|
||||||
{
|
|
||||||
$authors = '';
|
|
||||||
foreach ($this->authors as $author) {
|
|
||||||
$authors .= "> Author: $author \n";
|
|
||||||
}
|
|
||||||
$seeAlso = $this->seeAlso();
|
|
||||||
return <<<EOF
|
|
||||||
---
|
|
||||||
title: $this->name: $this->title
|
|
||||||
description: $this->description
|
|
||||||
image: https://docs.madelineproto.xyz/favicons/android-chrome-256x256.png
|
|
||||||
---
|
|
||||||
# `$this->name`: $this->title
|
|
||||||
[Back to API index](index.md)
|
|
||||||
|
|
||||||
$authors
|
|
||||||
|
|
||||||
$this->description
|
|
||||||
$seeAlso
|
|
||||||
EOF;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function shouldIgnore(): bool
|
|
||||||
{
|
|
||||||
return $this->ignore;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,119 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace danog\MadelineProto\PhpDoc;
|
|
||||||
|
|
||||||
use danog\MadelineProto\Logger;
|
|
||||||
use danog\MadelineProto\PhpDocBuilder;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Description;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Generic;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Param;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Return_;
|
|
||||||
use ReflectionFunctionAbstract;
|
|
||||||
use ReflectionMethod;
|
|
||||||
|
|
||||||
class MethodDoc extends GenericDoc
|
|
||||||
{
|
|
||||||
private Return_ $return;
|
|
||||||
private string $psalmReturn;
|
|
||||||
private array $params = [];
|
|
||||||
private array $psalmParams = [];
|
|
||||||
public function __construct(PhpDocBuilder $phpDocBuilder, ReflectionFunctionAbstract $method)
|
|
||||||
{
|
|
||||||
$this->builder = $phpDocBuilder;
|
|
||||||
$this->name = $method->getName();
|
|
||||||
$doc = $method->getDocComment();
|
|
||||||
if (!$doc) {
|
|
||||||
$this->ignore = true;
|
|
||||||
if ($method instanceof ReflectionMethod) {
|
|
||||||
Logger::log($method->getDeclaringClass()->getName().'::'.$method->getName().' has no PHPDOC!');
|
|
||||||
} else {
|
|
||||||
Logger::log($method->getName().' has no PHPDOC!');
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$doc = $this->builder->getFactory()->create($doc);
|
|
||||||
|
|
||||||
parent::__construct($doc, $method instanceof ReflectionMethod ? $method->getDeclaringClass() : $method);
|
|
||||||
|
|
||||||
foreach ($doc->getTags() as $tag) {
|
|
||||||
if ($tag instanceof Param && !isset($this->params[$tag->getVariableName()])) {
|
|
||||||
$this->params[$tag->getVariableName()] = [
|
|
||||||
$tag->getType(),
|
|
||||||
$tag->getDescription()
|
|
||||||
];
|
|
||||||
} elseif ($tag instanceof Return_ && !isset($this->return)) {
|
|
||||||
$this->return = $tag;
|
|
||||||
} elseif ($tag instanceof Generic && $tag->getName() === 'psalm-return') {
|
|
||||||
$this->psalmReturn = $tag;
|
|
||||||
} elseif ($tag instanceof Generic && $tag->getName() === 'psalm-param') {
|
|
||||||
[$type, $description] = \explode(" $", $tag->getDescription(), 2);
|
|
||||||
$description .= ' ';
|
|
||||||
[$varName, $description] = \explode(" ", $description, 2);
|
|
||||||
if (!$description && isset($this->params[$varName])) {
|
|
||||||
$description = (string) $this->params[$varName][1];
|
|
||||||
} else {
|
|
||||||
$description = new Description($description);
|
|
||||||
}
|
|
||||||
$this->psalmParams[$varName] = [
|
|
||||||
$type,
|
|
||||||
$description
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getSignature(): string
|
|
||||||
{
|
|
||||||
$sig = $this->name;
|
|
||||||
$sig .= "(";
|
|
||||||
foreach ($this->params as $var => [$type, $description]) {
|
|
||||||
$sig .= $type.' ';
|
|
||||||
$sig .= "$".$var;
|
|
||||||
$sig .= ', ';
|
|
||||||
}
|
|
||||||
$sig = \trim($sig, ', ');
|
|
||||||
$sig .= ')';
|
|
||||||
if (isset($this->return)) {
|
|
||||||
$sig .= ': ';
|
|
||||||
$sig .= $this->builder->resolveTypeAlias($this->className, $this->return);
|
|
||||||
}
|
|
||||||
return $sig;
|
|
||||||
}
|
|
||||||
public function format(): string
|
|
||||||
{
|
|
||||||
$sig = '### `'.$this->getSignature()."`";
|
|
||||||
$sig .= "\n\n";
|
|
||||||
$sig .= $this->title;
|
|
||||||
$sig .= "\n";
|
|
||||||
$sig .= $this->description;
|
|
||||||
$sig .= "\n";
|
|
||||||
if ($this->psalmParams || $this->params) {
|
|
||||||
$sig .= "\nParameters:\n";
|
|
||||||
foreach ($this->params as $name => [$type, $description]) {
|
|
||||||
if ($type) {
|
|
||||||
$type = $this->builder->resolveTypeAlias($this->className, $type);
|
|
||||||
}
|
|
||||||
$sig .= "* `\$$name`: `$type` $description \n";
|
|
||||||
if (isset($this->psalmParams[$name])) {
|
|
||||||
[$psalmType] = $this->psalmParams[$name];
|
|
||||||
$psalmType = \trim(\str_replace("\n", "\n ", $psalmType));
|
|
||||||
|
|
||||||
$sig .= " Full type:\n";
|
|
||||||
$sig .= " ```\n";
|
|
||||||
$sig .= " $psalmType\n";
|
|
||||||
$sig .= " ```\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$sig .= "\n";
|
|
||||||
}
|
|
||||||
if (isset($this->return) && $this->return->getDescription() && $this->return->getDescription()->render()) {
|
|
||||||
$sig .= "\nReturn value: ".$this->return->getDescription()."\n";
|
|
||||||
}
|
|
||||||
if (isset($this->psalmReturn)) {
|
|
||||||
$sig .= "\nFully typed return value:\n```\n".$this->psalmReturn."\n```";
|
|
||||||
}
|
|
||||||
$sig .= $this->seeAlso();
|
|
||||||
$sig .= "\n";
|
|
||||||
return $sig;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,287 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* PhpDocBuilder module.
|
|
||||||
*
|
|
||||||
* This file is part of MadelineProto.
|
|
||||||
* MadelineProto is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
* MadelineProto is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
* See the GNU Affero General Public License for more details.
|
|
||||||
* You should have received a copy of the GNU General Public License along with MadelineProto.
|
|
||||||
* If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* @author Daniil Gentili <daniil@daniil.it>
|
|
||||||
* @copyright 2016-2020 Daniil Gentili <daniil@daniil.it>
|
|
||||||
* @license https://opensource.org/licenses/AGPL-3.0 AGPLv3
|
|
||||||
*
|
|
||||||
* @link https://docs.madelineproto.xyz MadelineProto documentation
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace danog\MadelineProto;
|
|
||||||
|
|
||||||
use danog\ClassFinder\ClassFinder;
|
|
||||||
use danog\MadelineProto\PhpDoc\ClassDoc;
|
|
||||||
use danog\MadelineProto\PhpDoc\FunctionDoc;
|
|
||||||
use phpDocumentor\Reflection\DocBlock\Tags\Author;
|
|
||||||
use phpDocumentor\Reflection\DocBlockFactory;
|
|
||||||
use ReflectionClass;
|
|
||||||
use ReflectionFunction;
|
|
||||||
|
|
||||||
class PhpDocBuilder
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Namespace.
|
|
||||||
*/
|
|
||||||
private string $namespace;
|
|
||||||
/**
|
|
||||||
* Scan mode.
|
|
||||||
*/
|
|
||||||
private int $mode;
|
|
||||||
/**
|
|
||||||
* Docblock factory.
|
|
||||||
*/
|
|
||||||
private DocBlockFactory $factory;
|
|
||||||
/**
|
|
||||||
* Authors.
|
|
||||||
*/
|
|
||||||
private array $authors = [];
|
|
||||||
/**
|
|
||||||
* Classes/interfaces/traits to ignore.
|
|
||||||
*
|
|
||||||
* @var ?callable
|
|
||||||
* @psalm-var null|callable(class-string)
|
|
||||||
*/
|
|
||||||
private $ignore;
|
|
||||||
/**
|
|
||||||
* Output directory.
|
|
||||||
*/
|
|
||||||
private string $output;
|
|
||||||
/**
|
|
||||||
* Use map.
|
|
||||||
*
|
|
||||||
* array<class-string, array<class-string, class-string>>
|
|
||||||
*/
|
|
||||||
private array $useMap = [];
|
|
||||||
/**
|
|
||||||
* Create docblock builder.
|
|
||||||
*
|
|
||||||
* @param string $namespace Namespace (defaults to package namespace)
|
|
||||||
* @param int $mode Finder mode, an OR-selection of ClassFinder::ALLOW_*
|
|
||||||
*
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public static function fromNamespace(string $namespace = '', int $mode = ClassFinder::ALLOW_ALL): self
|
|
||||||
{
|
|
||||||
return new self($namespace, $mode);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param string $namespace
|
|
||||||
* @param int $mode
|
|
||||||
*/
|
|
||||||
private function __construct(string $namespace, int $mode)
|
|
||||||
{
|
|
||||||
$this->factory = DocBlockFactory::createInstance();
|
|
||||||
$this->namespace = $namespace;
|
|
||||||
$this->mode = $mode;
|
|
||||||
|
|
||||||
$appRoot = new \danog\ClassFinder\AppConfig;
|
|
||||||
$appRoot = $appRoot->getAppRoot();
|
|
||||||
$appRoot .= "/composer.json";
|
|
||||||
$json = \json_decode(\file_get_contents($appRoot), true);
|
|
||||||
$authors = $json['authors'] ?? [];
|
|
||||||
|
|
||||||
foreach ($authors as $author) {
|
|
||||||
$this->authors []= new Author($author['name'], $author['email']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->namespace) {
|
|
||||||
$namespaces = \array_keys($json['autoload']['psr-4']);
|
|
||||||
$this->namespace = $namespaces[0];
|
|
||||||
foreach ($namespaces as $namespace) {
|
|
||||||
if (\strlen($namespace) && \strlen($namespace) < \strlen($this->namespace)) {
|
|
||||||
$this->namespace = $namespace;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Set filter to ignore certain classes.
|
|
||||||
*
|
|
||||||
* @param callable $ignore
|
|
||||||
*
|
|
||||||
* @psalm-param callable(class-string) $ignore
|
|
||||||
*
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setFilter(callable $ignore): self
|
|
||||||
{
|
|
||||||
$this->ignore = $ignore;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Set output directory.
|
|
||||||
*
|
|
||||||
* @param string $output Output directory
|
|
||||||
*
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setOutput(string $output): self
|
|
||||||
{
|
|
||||||
$this->output = $output;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Run documentor.
|
|
||||||
*
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function run(): self
|
|
||||||
{
|
|
||||||
$classes = ClassFinder::getClassesInNamespace($this->namespace, $this->mode | ClassFinder::RECURSIVE_MODE);
|
|
||||||
foreach ($classes as $class) {
|
|
||||||
$this->addTypeAliases($class);
|
|
||||||
}
|
|
||||||
foreach ($classes as $class) {
|
|
||||||
if ($this->ignore && $this->shouldIgnore($class)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$class = \function_exists($class)
|
|
||||||
? new ReflectionFunction($class)
|
|
||||||
: new ReflectionClass($class);
|
|
||||||
$this->generate($class);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Resolve type alias.
|
|
||||||
*
|
|
||||||
* @internal
|
|
||||||
*
|
|
||||||
* @param string $fromClass Class from where this function is called
|
|
||||||
* @param string $name Name to resolve
|
|
||||||
*
|
|
||||||
* @psalm-param class-string $fromClass Class from where this function is called
|
|
||||||
* @psalm-param class-string $name Name to resolve
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function resolveTypeAlias(string $fromClass, string $name): string
|
|
||||||
{
|
|
||||||
return $this->useMap[$fromClass][$name] ?? $name;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Add type alias.
|
|
||||||
*
|
|
||||||
* @param string $class
|
|
||||||
*
|
|
||||||
* @psalm-param class-string $class
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function addTypeAliases(string $class)
|
|
||||||
{
|
|
||||||
$reflectionClass = \function_exists($class)
|
|
||||||
? new ReflectionFunction($class)
|
|
||||||
: new ReflectionClass($class);
|
|
||||||
$payload = \file_get_contents($reflectionClass->getFileName());
|
|
||||||
\preg_match_all("/use *(function)? +(.*?)(?: +as +(.+))? *;/", $payload, $matches, PREG_SET_ORDER|PREG_UNMATCHED_AS_NULL);
|
|
||||||
foreach ($matches as [, $function, $import, $alias]) {
|
|
||||||
$import = "\\$import";
|
|
||||||
$alias ??= \basename(\str_replace('\\', '/', $import));
|
|
||||||
$this->useMap[$class][$alias] = $import;
|
|
||||||
$this->useMap[$class]['\\'.$alias] = $import;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Create directory recursively.
|
|
||||||
*
|
|
||||||
* @param string $file
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
private static function createDir(string $file): string
|
|
||||||
{
|
|
||||||
$dir = \dirname($file);
|
|
||||||
if (!\file_exists($dir)) {
|
|
||||||
self::createDir($dir);
|
|
||||||
\mkdir($dir);
|
|
||||||
}
|
|
||||||
return $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate documentation for class.
|
|
||||||
*
|
|
||||||
* @param ReflectionClass|ReflectionFunction $class Class
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function generate($class): void
|
|
||||||
{
|
|
||||||
$name = $class->getName();
|
|
||||||
$fName = $this->output;
|
|
||||||
$fName .= \str_replace('\\', DIRECTORY_SEPARATOR, $name);
|
|
||||||
$fName .= '.md';
|
|
||||||
|
|
||||||
$class = $class instanceof ReflectionFunction
|
|
||||||
? new FunctionDoc($this, $class)
|
|
||||||
: new ClassDoc($this, $class);
|
|
||||||
if ($class->shouldIgnore()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$class = $class->format();
|
|
||||||
|
|
||||||
$handle = \fopen(self::createDir($fName), 'w+');
|
|
||||||
\fwrite($handle, $class);
|
|
||||||
\fclose($handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get docblock factory.
|
|
||||||
*
|
|
||||||
* @internal
|
|
||||||
*
|
|
||||||
* @return DocBlockFactory
|
|
||||||
*/
|
|
||||||
public function getFactory(): DocBlockFactory
|
|
||||||
{
|
|
||||||
return $this->factory;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether should ignore trait/class/interface.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function shouldIgnore(string $class): bool
|
|
||||||
{
|
|
||||||
return !($this->ignore)($class);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get authors.
|
|
||||||
*
|
|
||||||
* @return Author[]
|
|
||||||
*/
|
|
||||||
public function getAuthors(): array
|
|
||||||
{
|
|
||||||
return $this->authors;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set authors.
|
|
||||||
*
|
|
||||||
* @param Author[] $authors Authors
|
|
||||||
*
|
|
||||||
* @return self
|
|
||||||
*/
|
|
||||||
public function setAuthors(array $authors): self
|
|
||||||
{
|
|
||||||
$this->authors = $authors;
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -33,7 +33,8 @@ interface BufferedStreamInterface extends StreamInterface
|
||||||
*
|
*
|
||||||
* @param int $length Length of payload, as detected by this layer
|
* @param int $length Length of payload, as detected by this layer
|
||||||
*
|
*
|
||||||
* @return Promise<BufferInterface>
|
* @return Promise
|
||||||
|
* @psalm-return Promise<BufferInterface>
|
||||||
*/
|
*/
|
||||||
public function getReadBuffer(&$length): Promise;
|
public function getReadBuffer(&$length): Promise;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -920,7 +920,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @psalm-suppress InvalidScope
|
* @psalm-suppress InvalidScope
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function after($a, $b)
|
public function after($a, $b)
|
||||||
{
|
{
|
||||||
|
@ -932,7 +932,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<\Generator|Promise> $promises Promises
|
* @param array<\Generator|Promise> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function all(array $promises)
|
public function all(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -943,7 +943,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function any(array $promises)
|
public function any(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -1001,7 +1001,7 @@ class InternalDoc extends APIFactory
|
||||||
* @template TReturn
|
* @template TReturn
|
||||||
* @psalm-param \Generator<mixed, mixed, mixed, TReturn>|Promise<TReturn>|TReturn $promise
|
* @psalm-param \Generator<mixed, mixed, mixed, TReturn>|Promise<TReturn>|TReturn $promise
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
* @psalm-return Promise<TReturn>
|
* @psalm-return Promise<TReturn>
|
||||||
*/
|
*/
|
||||||
public function call($promise)
|
public function call($promise)
|
||||||
|
@ -1017,7 +1017,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @psalm-suppress InvalidScope
|
* @psalm-suppress InvalidScope
|
||||||
*
|
*
|
||||||
* @return Promise|mixed
|
* @return \Amp\Promise|mixed
|
||||||
*/
|
*/
|
||||||
public function callFork($promise, $actual = null, $file = '')
|
public function callFork($promise, $actual = null, $file = '')
|
||||||
{
|
{
|
||||||
|
@ -1050,7 +1050,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param string $string Message to echo
|
* @param string $string Message to echo
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function echo(string $string)
|
public function echo(string $string)
|
||||||
{
|
{
|
||||||
|
@ -1072,7 +1072,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function first(array $promises)
|
public function first(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -1088,7 +1088,7 @@ class InternalDoc extends APIFactory
|
||||||
* @param ?Promise $token Cancellation token
|
* @param ?Promise $token Cancellation token
|
||||||
* @param ?callable $failureCb Failure callback, called only once if the first locking attempt fails.
|
* @param ?callable $failureCb Failure callback, called only once if the first locking attempt fails.
|
||||||
*
|
*
|
||||||
* @return Promise<?callable>
|
* @return \Amp\Promise<?callable>
|
||||||
*/
|
*/
|
||||||
public function flock(string $file, int $operation, float $polling = 0.1, ?\Amp\Promise $token = null, $failureCb = null)
|
public function flock(string $file, int $operation, float $polling = 0.1, ?\Amp\Promise $token = null, $failureCb = null)
|
||||||
{
|
{
|
||||||
|
@ -1378,7 +1378,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param string $prompt Prompt
|
* @param string $prompt Prompt
|
||||||
*
|
*
|
||||||
* @return Promise<string>
|
* @return \Amp\Promise<string>
|
||||||
*/
|
*/
|
||||||
public function readLine(string $prompt = '')
|
public function readLine(string $prompt = '')
|
||||||
{
|
{
|
||||||
|
@ -1442,7 +1442,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param int|float $time Number of seconds to sleep for
|
* @param int|float $time Number of seconds to sleep for
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function sleep($time)
|
public function sleep($time)
|
||||||
{
|
{
|
||||||
|
@ -1454,7 +1454,7 @@ class InternalDoc extends APIFactory
|
||||||
*
|
*
|
||||||
* @param array<Promise|\Generator> $promises Promises
|
* @param array<Promise|\Generator> $promises Promises
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function some(array $promises)
|
public function some(array $promises)
|
||||||
{
|
{
|
||||||
|
@ -1466,7 +1466,7 @@ class InternalDoc extends APIFactory
|
||||||
* @param \Generator|Promise $promise
|
* @param \Generator|Promise $promise
|
||||||
* @param integer $timeout
|
* @param integer $timeout
|
||||||
*
|
*
|
||||||
* @return Promise
|
* @return \Amp\Promise
|
||||||
*/
|
*/
|
||||||
public function timeout($promise, int $timeout)
|
public function timeout($promise, int $timeout)
|
||||||
{
|
{
|
||||||
|
@ -1490,7 +1490,7 @@ class InternalDoc extends APIFactory
|
||||||
* @psalm-param Promise<TReturn>|TGenerator $promise Promise to which the timeout is applied.
|
* @psalm-param Promise<TReturn>|TGenerator $promise Promise to which the timeout is applied.
|
||||||
* @psalm-param TReturnAlt $default
|
* @psalm-param TReturnAlt $default
|
||||||
*
|
*
|
||||||
* @return Promise<TReturn>|Promise<TReturnAlt>
|
* @return \Amp\Promise<TReturn>|Promise<TReturnAlt>
|
||||||
*
|
*
|
||||||
* @throws \TypeError If $promise is not an instance of \Amp\Promise, \Generator or \React\Promise\PromiseInterface.
|
* @throws \TypeError If $promise is not an instance of \Amp\Promise, \Generator or \React\Promise\PromiseInterface.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -23,7 +23,6 @@ use danog\MadelineProto\MTProtoTools\PasswordCalculator;
|
||||||
use danog\MadelineProto\MTProtoTools\ReferenceDatabase;
|
use danog\MadelineProto\MTProtoTools\ReferenceDatabase;
|
||||||
use danog\MadelineProto\MTProtoTools\UpdatesState;
|
use danog\MadelineProto\MTProtoTools\UpdatesState;
|
||||||
use danog\MadelineProto\NothingInTheSocketException;
|
use danog\MadelineProto\NothingInTheSocketException;
|
||||||
use danog\MadelineProto\PhpDocBuilder;
|
|
||||||
use danog\MadelineProto\RSA;
|
use danog\MadelineProto\RSA;
|
||||||
use danog\MadelineProto\Serialization;
|
use danog\MadelineProto\Serialization;
|
||||||
use danog\MadelineProto\SessionPaths;
|
use danog\MadelineProto\SessionPaths;
|
||||||
|
@ -39,6 +38,7 @@ use danog\MadelineProto\TON\APIFactory as TONAPIFactory;
|
||||||
use danog\MadelineProto\TON\InternalDoc as TONInternalDoc;
|
use danog\MadelineProto\TON\InternalDoc as TONInternalDoc;
|
||||||
use danog\MadelineProto\TON\Lite;
|
use danog\MadelineProto\TON\Lite;
|
||||||
use danog\MadelineProto\VoIP;
|
use danog\MadelineProto\VoIP;
|
||||||
|
use danog\PhpDoc\PhpDocBuilder;
|
||||||
|
|
||||||
require 'vendor/autoload.php';
|
require 'vendor/autoload.php';
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ $filter = function (string $class) use ($ignore): bool {
|
||||||
|| str_starts_with($class, 'danog\\MadelineProto\\MTProto\\')
|
|| str_starts_with($class, 'danog\\MadelineProto\\MTProto\\')
|
||||||
|| str_starts_with($class, 'danog\\MadelineProto\\MTProtoSession\\')
|
|| str_starts_with($class, 'danog\\MadelineProto\\MTProtoSession\\')
|
||||||
|| str_starts_with($class, 'danog\\MadelineProto\\PhpDoc\\')
|
|| str_starts_with($class, 'danog\\MadelineProto\\PhpDoc\\')
|
||||||
|
|| str_starts_with($class, 'danog\\MadelineProto\\Stream\\')
|
||||||
|| str_starts_with($class, 'danog\\MadelineProto\\Db\\NullCache')) {
|
|| str_starts_with($class, 'danog\\MadelineProto\\Db\\NullCache')) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue