From 5c4487c98030d6dcedf0c53d805c49503a6b179c Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 29 Jan 2020 19:56:16 +0000 Subject: [PATCH] added some callable prototypes for phpstan --- src/entity/effect/EffectManager.php | 16 ++++++++++++++-- src/network/mcpe/ChunkRequestTask.php | 8 +++++++- src/network/mcpe/NetworkSession.php | 4 ++++ .../mcpe/compression/CompressBatchPromise.php | 9 ++++++++- src/plugin/PluginManager.php | 5 +++++ src/scheduler/CancellableClosureTask.php | 7 ++++++- src/timings/TimingsHandler.php | 4 ++++ src/utils/Utils.php | 3 +++ src/world/BlockTransaction.php | 7 ++++++- src/world/utils/SubChunkIteratorManager.php | 8 +++++++- 10 files changed, 64 insertions(+), 7 deletions(-) diff --git a/src/entity/effect/EffectManager.php b/src/entity/effect/EffectManager.php index 7cead7f74..8545f2232 100644 --- a/src/entity/effect/EffectManager.php +++ b/src/entity/effect/EffectManager.php @@ -44,9 +44,15 @@ class EffectManager{ /** @var bool */ protected $onlyAmbientEffects = false; - /** @var \Closure[] */ + /** + * @var \Closure[] + * @phpstan-var (\Closure(EffectInstance, bool $replacesOldEffect) : void)[] + */ protected $effectAddHooks = []; - /** @var \Closure[] */ + /** + * @var \Closure[] + * @phpstan-var (\Closure(EffectInstance) : void)[] + */ protected $effectRemoveHooks = []; public function __construct(Living $entity){ @@ -214,11 +220,17 @@ class EffectManager{ return !empty($this->effects); } + /** + * @phpstan-param \Closure(EffectInstance, bool $replacesOldEffect) : void $closure + */ public function onEffectAdd(\Closure $closure) : void{ Utils::validateCallableSignature(function(EffectInstance $effect, bool $replacesOldEffect) : void{}, $closure); $this->effectAddHooks[spl_object_id($closure)] = $closure; } + /** + * @phpstan-param \Closure(EffectInstance) : void $closure + */ public function onEffectRemove(\Closure $closure) : void{ Utils::validateCallableSignature(function(EffectInstance $effect) : void{}, $closure); $this->effectRemoveHooks[spl_object_id($closure)] = $closure; diff --git a/src/network/mcpe/ChunkRequestTask.php b/src/network/mcpe/ChunkRequestTask.php index 3062b1383..299bfd7eb 100644 --- a/src/network/mcpe/ChunkRequestTask.php +++ b/src/network/mcpe/ChunkRequestTask.php @@ -48,6 +48,9 @@ class ChunkRequestTask extends AsyncTask{ /** @var string */ private $tiles = ""; + /** + * @phpstan-param (\Closure() : void)|null $onError + */ public function __construct(int $chunkX, int $chunkZ, Chunk $chunk, CompressBatchPromise $promise, ?\Closure $onError = null){ $this->compressionLevel = Zlib::$LEVEL; @@ -68,7 +71,10 @@ class ChunkRequestTask extends AsyncTask{ } public function onError() : void{ - /** @var \Closure|null $hook */ + /** + * @var \Closure|null $hook + * @phpstan-var (\Closure() : void)|null $hook + */ $hook = $this->fetchLocal(self::TLS_KEY_ERROR_HOOK); if($hook !== null){ $hook(); diff --git a/src/network/mcpe/NetworkSession.php b/src/network/mcpe/NetworkSession.php index f5044b9a4..a20855061 100644 --- a/src/network/mcpe/NetworkSession.php +++ b/src/network/mcpe/NetworkSession.php @@ -430,6 +430,9 @@ class NetworkSession{ $this->sender->send($payload, $immediate); } + /** + * @phpstan-param \Closure() : void $func + */ private function tryDisconnect(\Closure $func, string $reason) : void{ if($this->connected and !$this->disconnectGuard){ $this->disconnectGuard = true; @@ -731,6 +734,7 @@ class NetworkSession{ /** * Instructs the networksession to start using the chunk at the given coordinates. This may occur asynchronously. * @param \Closure $onCompletion To be called when chunk sending has completed. + * @phpstan-param \Closure(int $chunkX, int $chunkZ) : void $onCompletion */ public function startUsingChunk(int $chunkX, int $chunkZ, \Closure $onCompletion) : void{ Utils::validateCallableSignature(function(int $chunkX, int $chunkZ){}, $onCompletion); diff --git a/src/network/mcpe/compression/CompressBatchPromise.php b/src/network/mcpe/compression/CompressBatchPromise.php index f1d6c777e..94909d5fd 100644 --- a/src/network/mcpe/compression/CompressBatchPromise.php +++ b/src/network/mcpe/compression/CompressBatchPromise.php @@ -27,7 +27,10 @@ use pocketmine\utils\Utils; use function array_push; class CompressBatchPromise{ - /** @var \Closure[] */ + /** + * @var \Closure[] + * @phpstan-var (\Closure(self) : void)[] + */ private $callbacks = []; /** @var string|null */ @@ -36,6 +39,9 @@ class CompressBatchPromise{ /** @var bool */ private $cancelled = false; + /** + * @phpstan-param \Closure(self) : void ...$callbacks + */ public function onResolve(\Closure ...$callbacks) : void{ $this->checkCancelled(); foreach($callbacks as $callback){ @@ -65,6 +71,7 @@ class CompressBatchPromise{ /** * @return \Closure[] + * @phpstan-return (\Closure(self) : void)[] */ public function getResolveCallbacks() : array{ return $this->callbacks; diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index dce9ca86e..8788520ce 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -499,6 +499,7 @@ class PluginManager{ } } + /** @phpstan-var \ReflectionClass $eventClass */ $this->registerEvent($eventClass->getName(), $handlerClosure, $priority, $plugin, $handleCancelled); } } @@ -507,6 +508,10 @@ class PluginManager{ /** * @param string $event Class name that extends Event * + * @phpstan-template TEvent of Event + * @phpstan-param class-string $event + * @phpstan-param \Closure(TEvent) : void $handler + * * @throws \ReflectionException */ public function registerEvent(string $event, \Closure $handler, int $priority, Plugin $plugin, bool $handleCancelled = false) : void{ diff --git a/src/scheduler/CancellableClosureTask.php b/src/scheduler/CancellableClosureTask.php index a900170e9..934edb9dd 100644 --- a/src/scheduler/CancellableClosureTask.php +++ b/src/scheduler/CancellableClosureTask.php @@ -45,7 +45,10 @@ class CancellableClosureTask extends Task{ public const CONTINUE = true; public const CANCEL = false; - /** @var \Closure */ + /** + * @var \Closure + * @phpstan-var \Closure(int $currentTick) : bool + */ private $closure; /** @@ -53,6 +56,8 @@ class CancellableClosureTask extends Task{ * * The closure should follow the signature callback(int $currentTick) : bool. The return value will be used to * decide whether to continue repeating. + * + * @phpstan-param \Closure(int $currentTick) : bool $closure */ public function __construct(\Closure $closure){ Utils::validateCallableSignature(function(int $currentTick) : bool{ return false; }, $closure); diff --git a/src/timings/TimingsHandler.php b/src/timings/TimingsHandler.php index 2d3de3972..2b889ed1e 100644 --- a/src/timings/TimingsHandler.php +++ b/src/timings/TimingsHandler.php @@ -197,6 +197,10 @@ class TimingsHandler{ /** * @return mixed the result of the given closure + * + * @phpstan-template TClosureReturn + * @phpstan-param \Closure() : TClosureReturn $closure + * @phpstan-return TClosureReturn */ public function time(\Closure $closure){ $this->startTiming(); diff --git a/src/utils/Utils.php b/src/utils/Utils.php index 1c634a875..0186cd201 100644 --- a/src/utils/Utils.php +++ b/src/utils/Utils.php @@ -131,6 +131,9 @@ class Utils{ return $reflect->getName(); } + /** + * @phpstan-return \Closure(object) : object + */ public static function cloneCallback() : \Closure{ return static function(object $o){ return clone $o; diff --git a/src/world/BlockTransaction.php b/src/world/BlockTransaction.php index 55108bc49..996649a5d 100644 --- a/src/world/BlockTransaction.php +++ b/src/world/BlockTransaction.php @@ -34,7 +34,10 @@ class BlockTransaction{ /** @var Block[][][] */ private $blocks = []; - /** @var \Closure[] */ + /** + * @var \Closure[] + * @phpstan-var (\Closure(ChunkManager $world, int $x, int $y, int $z) : bool)[] + */ private $validators = []; public function __construct(ChunkManager $world){ @@ -115,6 +118,8 @@ class BlockTransaction{ * Add a validation predicate which will be used to validate every block. * The callable signature should be the same as the below dummy function. * @see BlockTransaction::dummyValidator() + * + * @phpstan-param \Closure(ChunkManager $world, int $x, int $y, int $z) : bool $validator */ public function addValidator(\Closure $validator) : void{ Utils::validateCallableSignature([$this, 'dummyValidator'], $validator); diff --git a/src/world/utils/SubChunkIteratorManager.php b/src/world/utils/SubChunkIteratorManager.php index 5512f4251..6187f367e 100644 --- a/src/world/utils/SubChunkIteratorManager.php +++ b/src/world/utils/SubChunkIteratorManager.php @@ -45,7 +45,10 @@ class SubChunkIteratorManager{ /** @var int */ protected $currentZ; - /** @var \Closure|null */ + /** + * @var \Closure|null + * @phpstan-var (\Closure() : void)|null + */ private $onSubChunkChangeFunc = null; public function __construct(ChunkManager $world){ @@ -83,6 +86,9 @@ class SubChunkIteratorManager{ return true; } + /** + * @phpstan-param \Closure() : void $callback + */ public function onSubChunkChange(\Closure $callback) : void{ Utils::validateCallableSignature(function(){}, $callback); $this->onSubChunkChangeFunc = $callback;