From d867ffc60df0544ca5100bd566ed1db812dd74af Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Dec 2019 21:14:09 +0000 Subject: [PATCH 1/4] MetadataStore: fix some doc comments --- src/pocketmine/metadata/MetadataStore.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/metadata/MetadataStore.php b/src/pocketmine/metadata/MetadataStore.php index c6a9736e3..7d2519c8a 100644 --- a/src/pocketmine/metadata/MetadataStore.php +++ b/src/pocketmine/metadata/MetadataStore.php @@ -29,7 +29,7 @@ namespace pocketmine\metadata; use pocketmine\plugin\Plugin; abstract class MetadataStore{ - /** @var \SplObjectStorage[] */ + /** @var \SplObjectStorage[]|MetadataValue[][] */ private $metadataMap; /** @@ -100,7 +100,7 @@ abstract class MetadataStore{ * @param Plugin $owningPlugin */ public function invalidateAll(Plugin $owningPlugin){ - /** @var MetadataValue[] $values */ + /** @var \SplObjectStorage|MetadataValue[] $values */ foreach($this->metadataMap as $values){ if(isset($values[$owningPlugin])){ $values[$owningPlugin]->invalidate(); From 39c607cbd5e134a47fa338628d54eea4e45d6bc3 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Dec 2019 21:31:35 +0000 Subject: [PATCH 2/4] Position: mark level field as nullable allowing the level to be null is, to be honest, a big design flaw, but one that can't be fixed without BC breaks. --- src/pocketmine/level/Position.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pocketmine/level/Position.php b/src/pocketmine/level/Position.php index 6bcb599bc..608c412c5 100644 --- a/src/pocketmine/level/Position.php +++ b/src/pocketmine/level/Position.php @@ -29,7 +29,7 @@ use function assert; class Position extends Vector3{ - /** @var Level */ + /** @var Level|null */ public $level = null; /** From 8ecf5e02b95c4efc29ccafe455657278c7ea03f2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Dec 2019 22:00:19 +0000 Subject: [PATCH 3/4] bad fix for WritableBook phpstan warning master has this shit so much better --- src/pocketmine/item/WritableBook.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/pocketmine/item/WritableBook.php b/src/pocketmine/item/WritableBook.php index cc73eec18..8b965b787 100644 --- a/src/pocketmine/item/WritableBook.php +++ b/src/pocketmine/item/WritableBook.php @@ -186,16 +186,18 @@ class WritableBook extends Item{ * @return CompoundTag[] */ public function getPages() : array{ - $pages = $this->getNamedTag()->getListTag(self::TAG_PAGES); - if($pages === null){ - return []; - } + /** @var CompoundTag[] $pages */ + $pages = $this->getPagesTag()->getValue(); - return $pages->getValue(); + return $pages; } protected function getPagesTag() : ListTag{ - return $this->getNamedTag()->getListTag(self::TAG_PAGES) ?? new ListTag(self::TAG_PAGES, [], NBT::TAG_Compound); + $pagesTag = $this->getNamedTag()->getListTag(self::TAG_PAGES); + if($pagesTag !== null and $pagesTag->getTagType() === NBT::TAG_Compound){ + return $pagesTag; + } + return new ListTag(self::TAG_PAGES, [], NBT::TAG_Compound); } /** From 7b1ae2a82271bd58c0a3834e267bb5bc3bc35292 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 4 Dec 2019 22:12:14 +0000 Subject: [PATCH 4/4] phpstan: green on level 3 --- phpstan.neon.dist | 48 ++++++++++++++- tests/phpstan/configs/gc-hacks.neon | 80 +++++++++++++++++++++++++ tests/phpstan/configs/phpstan-bugs.neon | 15 +++++ 3 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 tests/phpstan/configs/gc-hacks.neon diff --git a/phpstan.neon.dist b/phpstan.neon.dist index d078a7acf..170897410 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,11 +1,12 @@ includes: + - tests/phpstan/configs/gc-hacks.neon - tests/phpstan/configs/optional-com-dotnet.neon - tests/phpstan/configs/optional-leveldb.neon - tests/phpstan/configs/phpstan-bugs.neon - tests/phpstan/configs/pthreads-bugs.neon parameters: - level: 2 + level: 3 autoload_files: - tests/phpstan/bootstrap.php - src/pocketmine/PocketMine.php @@ -24,6 +25,51 @@ parameters: path: src/pocketmine/command/defaults/TeleportCommand.php # comment: "not actually possible, but high cost to fix warning" + - + message: "#^Array \\(array\\\\) does not accept pocketmine\\\\entity\\\\Entity\\.$#" + count: 2 + path: src/pocketmine/entity/Entity.php + + - + message: "#^Invalid array key type pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/entity/Entity.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\EntityDeathEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\Living but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/EntityDeathEvent.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\EntityShootBowEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\Living but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/EntityShootBowEvent.php + + - + message: "#^Property pocketmine\\\\event\\\\entity\\\\EntityShootBowEvent\\:\\:\\$projectile \\(pocketmine\\\\entity\\\\projectile\\\\Projectile\\) does not accept pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/EntityShootBowEvent.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\ItemDespawnEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\object\\\\ItemEntity but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/ItemDespawnEvent.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\ItemSpawnEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\object\\\\ItemEntity but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/ItemSpawnEvent.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\ProjectileHitEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\projectile\\\\Projectile but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/ProjectileHitEvent.php + + - + message: "#^Method pocketmine\\\\event\\\\entity\\\\ProjectileLaunchEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\projectile\\\\Projectile but returns pocketmine\\\\entity\\\\Entity\\.$#" + count: 1 + path: src/pocketmine/event/entity/ProjectileLaunchEvent.php + - message: "#^Constructor of class pocketmine\\\\level\\\\generator\\\\hell\\\\Nether has an unused parameter \\$options\\.$#" count: 1 diff --git a/tests/phpstan/configs/gc-hacks.neon b/tests/phpstan/configs/gc-hacks.neon new file mode 100644 index 000000000..14267631d --- /dev/null +++ b/tests/phpstan/configs/gc-hacks.neon @@ -0,0 +1,80 @@ +#cyclic refs in lots of objects prevent GC, causing increased memory pressure +#the proper fix is to not have cycles, but in the meantime we have these hacks + +parameters: + ignoreErrors: + - + message: "#^Property pocketmine\\\\Player\\:\\:\\$sessionAdapter \\(pocketmine\\\\network\\\\mcpe\\\\PlayerNetworkSessionAdapter\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/Player.php + + - + message: "#^Property pocketmine\\\\Player\\:\\:\\$cursorInventory \\(pocketmine\\\\inventory\\\\PlayerCursorInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/Player.php + + - + message: "#^Property pocketmine\\\\Player\\:\\:\\$craftingGrid \\(pocketmine\\\\inventory\\\\CraftingGrid\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/Player.php + + - + message: "#^Property pocketmine\\\\Player\\:\\:\\$perm \\(pocketmine\\\\permission\\\\PermissibleBase\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/Player.php + + - + message: "#^Property pocketmine\\\\entity\\\\Entity\\:\\:\\$namedtag \\(pocketmine\\\\nbt\\\\tag\\\\CompoundTag\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/entity/Entity.php + + - + message: "#^Property pocketmine\\\\entity\\\\Human\\:\\:\\$inventory \\(pocketmine\\\\inventory\\\\PlayerInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/entity/Human.php + + - + message: "#^Property pocketmine\\\\entity\\\\Human\\:\\:\\$enderChestInventory \\(pocketmine\\\\inventory\\\\EnderChestInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/entity/Human.php + + - + message: "#^Property pocketmine\\\\entity\\\\Living\\:\\:\\$armorInventory \\(pocketmine\\\\inventory\\\\ArmorInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/entity/Living.php + + - + message: "#^Property pocketmine\\\\inventory\\\\DoubleChestInventory\\:\\:\\$left \\(pocketmine\\\\inventory\\\\ChestInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/inventory/DoubleChestInventory.php + + - + message: "#^Property pocketmine\\\\inventory\\\\DoubleChestInventory\\:\\:\\$right \\(pocketmine\\\\inventory\\\\ChestInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/inventory/DoubleChestInventory.php + + - + message: "#^Property pocketmine\\\\level\\\\Level\\:\\:\\$provider \\(pocketmine\\\\level\\\\format\\\\io\\\\LevelProvider\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/level/Level.php + + - + message: "#^Property pocketmine\\\\level\\\\Level\\:\\:\\$blockMetadata \\(pocketmine\\\\metadata\\\\BlockMetadataStore\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/level/Level.php + + - + message: "#^Property pocketmine\\\\level\\\\Level\\:\\:\\$temporalPosition \\(pocketmine\\\\level\\\\Position\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/level/Level.php + + - + message: "#^Property pocketmine\\\\tile\\\\Chest\\:\\:\\$inventory \\(pocketmine\\\\inventory\\\\ChestInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/tile/Chest.php + + - + message: "#^Property pocketmine\\\\tile\\\\Furnace\\:\\:\\$inventory \\(pocketmine\\\\inventory\\\\FurnaceInventory\\) does not accept null\\.$#" + count: 1 + path: ../../../src/pocketmine/tile/Furnace.php + diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 1f7c01b9c..696fcc8ab 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -16,3 +16,18 @@ parameters: message: "#^Cannot assign new offset to Threaded\\.$#" path: ../../../src + - + message: "#^Offset string does not exist on array\\(\\)\\.$#" + count: 3 + path: ../../../src/pocketmine/MemoryManager.php + + - + message: "#^Offset \\(int\\|string\\) does not exist on array\\(\\)\\.$#" + count: 1 + path: ../../../src/pocketmine/MemoryManager.php + + - + message: "#^Array \\(array\\) does not accept key int\\.$#" + count: 1 + path: ../../../src/pocketmine/plugin/PluginDescription.php +