From a51f9ad386dc1efb44e2037b2833c706a892aa21 Mon Sep 17 00:00:00 2001 From: Pol Dellaiera Date: Wed, 5 Aug 2020 10:00:17 +0200 Subject: [PATCH] Add more Psalm annotations. --- src/Iterator/CacheIterator.php | 19 ++++++++++++++++--- src/Iterator/ClosureIterator.php | 10 ++++++---- src/Iterator/IterableIterator.php | 5 +++++ src/Iterator/ProxyIterator.php | 11 +++++++++-- src/Iterator/ResourceIterator.php | 10 +++++++++- src/Iterator/SortableIterableIterator.php | 14 ++++++++++---- src/Iterator/StringIterator.php | 11 ++++++++--- 7 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/Iterator/CacheIterator.php b/src/Iterator/CacheIterator.php index 70a607609..36a92ad77 100644 --- a/src/Iterator/CacheIterator.php +++ b/src/Iterator/CacheIterator.php @@ -5,6 +5,7 @@ namespace loophp\collection\Iterator; use Iterator; +use OuterIterator; use Psr\Cache\CacheItemInterface; use Psr\Cache\CacheItemPoolInterface; @@ -14,8 +15,9 @@ * @psalm-template T * * @implements \Iterator + * @implements \OuterIterator */ -final class CacheIterator implements Iterator +final class CacheIterator implements Iterator, OuterIterator { /** * @var CacheItemPoolInterface @@ -48,7 +50,15 @@ public function __construct(Iterator $iterator, CacheItemPoolInterface $cache) */ public function current() { - return $this->getItemOrSave((string) $this->key)->get()[1]; + /** @var array{TKey, T} $data */ + $data = $this->getItemOrSave((string) $this->key)->get(); + + return $data[1]; + } + + public function getInnerIterator(): Iterator + { + return $this->inner; } /** @@ -56,7 +66,10 @@ public function current() */ public function key() { - return $this->getItemOrSave((string) $this->key)->get()[0]; + /** @var array{TKey, T} $data */ + $data = $this->getItemOrSave((string) $this->key)->get(); + + return $data[0]; } public function next(): void diff --git a/src/Iterator/ClosureIterator.php b/src/Iterator/ClosureIterator.php index 25189aff3..5cc716f88 100644 --- a/src/Iterator/ClosureIterator.php +++ b/src/Iterator/ClosureIterator.php @@ -14,7 +14,9 @@ * @psalm-template TKey of array-key * @psalm-template T * + * @extends ProxyIterator * @implements \Iterator + * @implements \OuterIterator */ final class ClosureIterator extends ProxyIterator implements Iterator, OuterIterator { @@ -26,20 +28,20 @@ final class ClosureIterator extends ProxyIterator implements Iterator, OuterIter /** * @var callable - * @psalm-var callable(mixed...):(Generator) + * @psalm-var callable(T...):(\Generator) */ private $callable; /** * @var Closure - * @psalm-var Closure(callable(T...):Generator, list):(Generator) + * @psalm-var Closure(callable(T...):\Generator, list):(\Generator) */ private $generator; /** * @param mixed ...$arguments * @psalm-param T ...$arguments - * @psalm-param callable(mixed...):(Generator) $callable + * @psalm-param callable(mixed...):(\Generator) $callable */ public function __construct(callable $callable, ...$arguments) { @@ -60,7 +62,7 @@ public function rewind(): void /** * Init the generator if not initialized yet. * - * @return Generator> + * @return Generator */ private function getGenerator(): Generator { diff --git a/src/Iterator/IterableIterator.php b/src/Iterator/IterableIterator.php index bdff9e8f6..2fd025763 100644 --- a/src/Iterator/IterableIterator.php +++ b/src/Iterator/IterableIterator.php @@ -13,7 +13,9 @@ * @psalm-template TKey of array-key * @psalm-template T * + * @extends ProxyIterator * @implements \Iterator + * @implements \OuterIterator */ final class IterableIterator extends ProxyIterator implements Iterator, OuterIterator { @@ -24,6 +26,9 @@ final class IterableIterator extends ProxyIterator implements Iterator, OuterIte public function __construct(iterable $iterable) { $this->iterator = new ClosureIterator( + /** + * @psalm-param iterable $iterable + */ static function (iterable $iterable): Generator { foreach ($iterable as $key => $value) { yield $key => $value; diff --git a/src/Iterator/ProxyIterator.php b/src/Iterator/ProxyIterator.php index fe76fda46..34410c979 100644 --- a/src/Iterator/ProxyIterator.php +++ b/src/Iterator/ProxyIterator.php @@ -7,15 +7,21 @@ use Generator; use Iterator; +/** + * @psalm-template TKey + * @psalm-template TKey of array-key + * @psalm-template T + */ abstract class ProxyIterator { /** - * @var Generator|\loophp\collection\Iterator\ClosureIterator + * @var Generator|Iterator */ protected $iterator; /** * @return mixed + * @psalm-return T */ public function current() { @@ -23,7 +29,7 @@ public function current() } /** - * @return Iterator + * @psalm-return \Iterator */ public function getInnerIterator(): Iterator { @@ -32,6 +38,7 @@ public function getInnerIterator(): Iterator /** * @return mixed + * @psalm-return TKey */ public function key() { diff --git a/src/Iterator/ResourceIterator.php b/src/Iterator/ResourceIterator.php index 501f249bc..199f1669e 100644 --- a/src/Iterator/ResourceIterator.php +++ b/src/Iterator/ResourceIterator.php @@ -9,7 +9,13 @@ use OuterIterator; /** - * @implements Iterator + * @psalm-template TKey + * @psalm-template TKey of array-key + * @psalm-template T + * + * @extends ProxyIterator + * @implements \Iterator + * @implements \OuterIterator */ final class ResourceIterator extends ProxyIterator implements Iterator, OuterIterator { @@ -23,6 +29,8 @@ public function __construct($resource) $closure = /** * @param resource $resource + * + * @psalm-return \Generator */ static function ($resource): Generator { while (false !== $chunk = fgetc($resource)) { diff --git a/src/Iterator/SortableIterableIterator.php b/src/Iterator/SortableIterableIterator.php index c164bd323..d56328409 100644 --- a/src/Iterator/SortableIterableIterator.php +++ b/src/Iterator/SortableIterableIterator.php @@ -8,26 +8,30 @@ use IteratorAggregate; /** - * Class SortableIterableIterator. + * @psalm-template TKey + * @psalm-template TKey of array-key + * @psalm-template T * - * @implements IteratorAggregate + * @implements IteratorAggregate> */ final class SortableIterableIterator implements IteratorAggregate { /** * @var callable + * @psalm-var callable(T, T):(int) $callable */ private $callable; /** * @var \loophp\collection\Iterator\IterableIterator + * @psalm-var \loophp\collection\Iterator\IterableIterator */ private $iterator; /** - * SortableIterator constructor. - * * @param iterable $iterable + * @psalm-param iterable $iterable + * @psalm-param callable(T, T):(int) $callable */ public function __construct(iterable $iterable, callable $callable) { @@ -37,6 +41,8 @@ public function __construct(iterable $iterable, callable $callable) /** * {@inheritdoc} + * + * @psalm-return \ArrayIterator */ public function getIterator() { diff --git a/src/Iterator/StringIterator.php b/src/Iterator/StringIterator.php index 4b124c668..432a757dd 100644 --- a/src/Iterator/StringIterator.php +++ b/src/Iterator/StringIterator.php @@ -11,15 +11,20 @@ /** * @psalm-template TKey * @psalm-template TKey of array-key - * @psalm-template T + * @psalm-template T of string * + * @extends ProxyIterator * @implements \Iterator + * @implements \OuterIterator */ final class StringIterator extends ProxyIterator implements Iterator, OuterIterator { public function __construct(string $data, string $delimiter = '') { $this->iterator = new ClosureIterator( + /** + * @psalm-return \Generator + */ static function (string $input, string $delimiter): Generator { $offset = 0; @@ -28,7 +33,7 @@ static function (string $input, string $delimiter): Generator { 1; while (mb_strlen($input) > $offset && false !== $nextOffset) { - yield mb_substr($input, $offset, $nextOffset - $offset); + yield (string) mb_substr($input, $offset, $nextOffset - $offset); $offset = $nextOffset + mb_strlen($delimiter); $nextOffset = '' !== $delimiter ? @@ -37,7 +42,7 @@ static function (string $input, string $delimiter): Generator { } if ('' !== $delimiter) { - yield mb_substr($input, $offset); + yield (string) mb_substr($input, $offset); } }, $data,