diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 2672e074c..09063dfee 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,4 +1,5 @@ includes: + - tests/phpstan/configs/ds-bugs.neon - tests/phpstan/configs/gc-hacks.neon - tests/phpstan/configs/gradual-level6.neon - tests/phpstan/configs/optional-com-dotnet.neon diff --git a/src/block/Banner.php b/src/block/Banner.php index 23f0a026a..cf32d486b 100644 --- a/src/block/Banner.php +++ b/src/block/Banner.php @@ -55,7 +55,10 @@ class Banner extends Transparent{ /** @var DyeColor */ protected $baseColor; - /** @var Deque|BannerPattern[] */ + /** + * @var Deque|BannerPattern[] + * @phpstan-var Deque + */ protected $patterns; public function __construct(BlockIdentifierFlattened $idInfo, string $name, ?BlockBreakInfo $breakInfo = null){ @@ -125,6 +128,7 @@ class Banner extends Transparent{ /** * @return Deque|BannerPattern[] + * @phpstan-return Deque */ public function getPatterns() : Deque{ return $this->patterns; @@ -132,6 +136,7 @@ class Banner extends Transparent{ /** * @param Deque|BannerPattern[] $patterns + * @phpstan-param Deque $patterns */ public function setPatterns(Deque $patterns) : void{ $checked = $patterns->filter(function($v){ return $v instanceof BannerPattern; }); diff --git a/src/block/tile/Banner.php b/src/block/tile/Banner.php index aed147de4..1860997e1 100644 --- a/src/block/tile/Banner.php +++ b/src/block/tile/Banner.php @@ -46,7 +46,10 @@ class Banner extends Spawnable{ /** @var DyeColor */ private $baseColor; - /** @var BannerPattern[]|Deque */ + /** + * @var BannerPattern[]|Deque + * @phpstan-var Deque + */ private $patterns; public function __construct(World $world, Vector3 $pos){ @@ -113,6 +116,7 @@ class Banner extends Spawnable{ /** * @return BannerPattern[]|Deque + * @phpstan-return Deque */ public function getPatterns() : Deque{ return $this->patterns; @@ -120,6 +124,7 @@ class Banner extends Spawnable{ /** * @param BannerPattern[]|Deque $patterns + * @phpstan-param Deque $patterns */ public function setPatterns(Deque $patterns) : void{ $this->patterns = $patterns; diff --git a/src/event/HandlerListManager.php b/src/event/HandlerListManager.php index a21e7a49c..ed1c2713b 100644 --- a/src/event/HandlerListManager.php +++ b/src/event/HandlerListManager.php @@ -58,11 +58,24 @@ class HandlerListManager{ } } + /** + * @param ReflectionClass $class + * @phpstan-param \ReflectionClass $class + * + * @return bool + */ private static function isValidClass(\ReflectionClass $class) : bool{ $tags = Utils::parseDocComment((string) $class->getDocComment()); return !$class->isAbstract() || isset($tags["allowHandle"]); } + /** + * @param \ReflectionClass $class + * @phpstan-param \ReflectionClass $class + * + * @return \ReflectionClass|null + * @phpstan-return \ReflectionClass|null + */ private static function resolveNearestHandleableParent(\ReflectionClass $class) : ?\ReflectionClass{ for($parent = $class->getParentClass(); $parent !== false && !self::isValidClass($parent); $parent = $parent->getParentClass()){ //NOOP diff --git a/src/item/Banner.php b/src/item/Banner.php index b07984482..7b0950c64 100644 --- a/src/item/Banner.php +++ b/src/item/Banner.php @@ -40,7 +40,10 @@ class Banner extends Item{ /** @var DyeColor */ private $color; - /** @var BannerPattern[]|Deque */ + /** + * @var BannerPattern[]|Deque + * @phpstan-var Deque + */ private $patterns; public function __construct(int $id, int $variant, string $name, DyeColor $color){ @@ -67,6 +70,7 @@ class Banner extends Item{ /** * @return Deque|BannerPattern[] + * @phpstan-return Deque */ public function getPatterns() : Deque{ return $this->patterns; @@ -74,6 +78,7 @@ class Banner extends Item{ /** * @param Deque|BannerPattern[] $patterns + * @phpstan-param Deque $patterns * * @return $this */ diff --git a/src/item/Item.php b/src/item/Item.php index cf22eb13f..cac81cf2d 100644 --- a/src/item/Item.php +++ b/src/item/Item.php @@ -86,9 +86,15 @@ class Item implements \JsonSerializable{ */ protected $blockEntityTag = null; - /** @var Set|string[] */ + /** + * @var Set|string[] + * @phpstan-var Set + */ protected $canPlaceOn; - /** @var Set|string[] */ + /** + * @var Set|string[] + * @phpstan-var Set + */ protected $canDestroy; /** @@ -202,6 +208,7 @@ class Item implements \JsonSerializable{ /** * @return Set|string[] + * @phpstan-return Set */ public function getCanPlaceOn() : Set{ return $this->canPlaceOn; @@ -209,6 +216,7 @@ class Item implements \JsonSerializable{ /** * @param Set|string[] $canPlaceOn + * @phpstan-param Set $canPlaceOn */ public function setCanPlaceOn(Set $canPlaceOn) : void{ $this->canPlaceOn = $canPlaceOn; @@ -216,6 +224,7 @@ class Item implements \JsonSerializable{ /** * @return Set|string[] + * @phpstan-return Set */ public function getCanDestroy() : Set{ return $this->canDestroy; @@ -223,6 +232,7 @@ class Item implements \JsonSerializable{ /** * @param Set|string[] $canDestroy + * @phpstan-param Set $canDestroy */ public function setCanDestroy(Set $canDestroy) : void{ $this->canDestroy = $canDestroy; diff --git a/src/item/WritableBookBase.php b/src/item/WritableBookBase.php index c29c4f97d..b822ab032 100644 --- a/src/item/WritableBookBase.php +++ b/src/item/WritableBookBase.php @@ -34,7 +34,10 @@ abstract class WritableBookBase extends Item{ public const TAG_PAGE_TEXT = "text"; //TAG_String public const TAG_PAGE_PHOTONAME = "photoname"; //TAG_String - TODO - /** @var WritableBookPage[]|Deque */ + /** + * @var WritableBookPage[]|Deque + * @phpstan-var Deque + */ private $pages; public function __construct(int $id, int $variant, string $name){ diff --git a/src/scheduler/AsyncTask.php b/src/scheduler/AsyncTask.php index 0135dd4ce..f59949192 100644 --- a/src/scheduler/AsyncTask.php +++ b/src/scheduler/AsyncTask.php @@ -48,6 +48,7 @@ use function unserialize; abstract class AsyncTask extends \Threaded{ /** * @var \ArrayObject|mixed[]|null object hash => mixed data + * @phpstan-var \ArrayObject>|null * * Used to store objects which are only needed on one thread and should not be serialized. */ diff --git a/tests/phpstan/configs/ds-bugs.neon b/tests/phpstan/configs/ds-bugs.neon new file mode 100644 index 000000000..93eddec8b --- /dev/null +++ b/tests/phpstan/configs/ds-bugs.neon @@ -0,0 +1,9 @@ +parameters: + ignoreErrors: + - + message: "#^Cannot (access an|assign new) offset (on|to) Ds\\\\Deque\\<.+\\>\\.$#" + path: ../../../src + + - + message: "#^Cannot (access|assign) offset (int|-?\\d+) (on|to) Ds\\\\Deque\\<.+\\>\\.$#" + path: ../../../src \ No newline at end of file diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 219cfb2b8..0e617c360 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -33,11 +33,6 @@ parameters: count: 1 path: ../../../src/block/Liquid.php - - - message: "#^Cannot access an offset on Ds\\\\Deque&iterable\\\\.$#" - count: 1 - path: ../../../src/block/tile/Banner.php - - message: "#^Call to function assert\\(\\) with false and 'unknown hit type' will always evaluate to false\\.$#" count: 1 @@ -54,11 +49,6 @@ parameters: count: 1 path: ../../../src/item/ItemFactory.php - - - message: "#^Cannot access offset int on Ds\\\\Deque&iterable\\\\.$#" - count: 2 - path: ../../../src/item/WritableBookBase.php - - #object to array cast analysis bug message: "#^Call to function is_object\\(\\) with int will always evaluate to false\\.$#" diff --git a/tests/phpstan/rules/DisallowEnumComparisonRule.php b/tests/phpstan/rules/DisallowEnumComparisonRule.php index 0e62fc96b..5370d158d 100644 --- a/tests/phpstan/rules/DisallowEnumComparisonRule.php +++ b/tests/phpstan/rules/DisallowEnumComparisonRule.php @@ -35,6 +35,9 @@ use PHPStan\Type\VerbosityLevel; use pocketmine\utils\EnumTrait; use function sprintf; +/** + * @phpstan-implements Rule + */ class DisallowEnumComparisonRule implements Rule{ public function getNodeType() : string{