diff --git a/.gitignore b/.gitignore index 7c65b549f..9cca0e13e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ server.properties memory_dumps/* resource_packs/ server.lock +/phpstan.neon # Common IDEs .idea/ diff --git a/phpstan.neon b/phpstan.neon deleted file mode 100644 index e2d3ca6d5..000000000 --- a/phpstan.neon +++ /dev/null @@ -1,105 +0,0 @@ -includes: - - 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 - autoload_files: - - tests/phpstan/bootstrap.php - - src/pocketmine/PocketMine.php - paths: - - src - reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings - ignoreErrors: - - - message: "#^pocketmine\\\\Player\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\entity\\\\Human\\.$#" - path: src/pocketmine/Player.php - - - - message: "#^pocketmine\\\\block\\\\[A-Za-z\\d]+\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\block\\\\Block\\.$#" - path: src/pocketmine/block - - - - message: "#^pocketmine\\\\block\\\\Block\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\level\\\\Position\\.$#" - count: 1 - path: src/pocketmine/block/Block.php - - - - message: "#^pocketmine\\\\inventory\\\\DoubleChestInventory\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\inventory\\\\ChestInventory\\.$#" - count: 1 - path: src/pocketmine/inventory/DoubleChestInventory.php - - - - message: "#^pocketmine\\\\inventory\\\\EnderChestInventory\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\inventory\\\\ChestInventory\\.$#" - count: 1 - path: src/pocketmine/inventory/EnderChestInventory.php - - - - message: "#^pocketmine\\\\item\\\\GoldenAppleEnchanted\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\item\\\\GoldenApple\\.$#" - count: 1 - path: src/pocketmine/item/GoldenAppleEnchanted.php - - - - message: "#^pocketmine\\\\item\\\\WrittenBook\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\item\\\\WritableBook\\.$#" - count: 1 - path: src/pocketmine/item/WrittenBook.php - - - - message: "#^Constructor of class pocketmine\\\\level\\\\generator\\\\hell\\\\Nether has an unused parameter \\$options\\.$#" - count: 1 - path: src/pocketmine/level/generator/hell/Nether.php - - - - message: "#^Constructor of class pocketmine\\\\level\\\\generator\\\\normal\\\\Normal has an unused parameter \\$options\\.$#" - count: 1 - path: src/pocketmine/level/generator/normal/Normal.php - - - - message: "#^Used constant pocketmine\\\\RESOURCE_PATH not found\\.$#" - count: 1 - path: src/pocketmine/network/mcpe/protocol/StartGamePacket.php - - - - message: "#^Constructor of class pocketmine\\\\scheduler\\\\TaskScheduler has an unused parameter \\$logger\\.$#" - count: 1 - path: src/pocketmine/scheduler/TaskScheduler.php - - - - message: "#^Constant pocketmine\\\\COMPOSER_AUTOLOADER_PATH not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\DATA not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\GIT_COMMIT not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\PATH not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\PLUGIN_PATH not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\RESOURCE_PATH not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\START_TIME not found\\.$#" - path: src/pocketmine - - - - message: "#^Constant pocketmine\\\\VERSION not found\\.$#" - path: src/pocketmine - - - - message: "#^Call to an undefined method pocketmine\\\\command\\\\CommandSender\\:\\:teleport\\(\\)\\.$#" - count: 1 - path: src/pocketmine/command/defaults/TeleportCommand.php - comment: "not actually possible, but high cost to fix warning" diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 000000000..170897410 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,124 @@ +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: 3 + autoload_files: + - tests/phpstan/bootstrap.php + - src/pocketmine/PocketMine.php + paths: + - src + reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings + ignoreErrors: + - + message: "#^Cannot instantiate interface pocketmine\\\\level\\\\format\\\\io\\\\LevelProvider\\.$#" + count: 1 + path: src/pocketmine/Server.php + + - + message: "#^Call to an undefined method pocketmine\\\\command\\\\CommandSender\\:\\:teleport\\(\\)\\.$#" + count: 1 + 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 + path: src/pocketmine/level/generator/hell/Nether.php + + - + message: "#^Constructor of class pocketmine\\\\level\\\\generator\\\\normal\\\\Normal has an unused parameter \\$options\\.$#" + count: 1 + path: src/pocketmine/level/generator/normal/Normal.php + + - + message: "#^Used constant pocketmine\\\\RESOURCE_PATH not found\\.$#" + count: 1 + path: src/pocketmine/network/mcpe/protocol/StartGamePacket.php + + - + message: "#^Constructor of class pocketmine\\\\scheduler\\\\TaskScheduler has an unused parameter \\$logger\\.$#" + count: 1 + path: src/pocketmine/scheduler/TaskScheduler.php + + - + message: "#^Constant pocketmine\\\\COMPOSER_AUTOLOADER_PATH not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\DATA not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\GIT_COMMIT not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\PATH not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\PLUGIN_PATH not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\RESOURCE_PATH not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\START_TIME not found\\.$#" + path: src + + - + message: "#^Constant pocketmine\\\\VERSION not found\\.$#" + path: src + diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 150b75f87..bcc068d7a 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1799,7 +1799,6 @@ class Server{ return $this->broadcast($message, self::BROADCAST_CHANNEL_USERS); } - /** @var CommandSender[] $recipients */ foreach($recipients as $recipient){ $recipient->sendMessage($message); } @@ -1824,7 +1823,6 @@ class Server{ } } - /** @var Player[] $recipients */ foreach($recipients as $recipient){ $recipient->sendTip($tip); } @@ -1850,7 +1848,6 @@ class Server{ } } - /** @var Player[] $recipients */ foreach($recipients as $recipient){ $recipient->sendPopup($popup); } @@ -1880,7 +1877,6 @@ class Server{ } } - /** @var Player[] $recipients */ foreach($recipients as $recipient){ $recipient->addTitle($title, $subtitle, $fadeIn, $stay, $fadeOut); } diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 3eb596d78..a2b3468e9 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -2048,7 +2048,7 @@ abstract class Entity extends Location implements Metadatable, EntityIds{ * @param Player $player */ public function spawnTo(Player $player) : void{ - if(!isset($this->hasSpawned[$player->getLoaderId()])){ + if(!isset($this->hasSpawned[$player->getLoaderId()]) and $this->chunk !== null and isset($player->usedChunks[Level::chunkHash($this->chunk->getX(), $this->chunk->getZ())])){ $this->hasSpawned[$player->getLoaderId()] = $player; $this->sendSpawnPacket($player); diff --git a/src/pocketmine/event/Event.php b/src/pocketmine/event/Event.php index 015cdaafd..b2c0b9dee 100644 --- a/src/pocketmine/event/Event.php +++ b/src/pocketmine/event/Event.php @@ -56,7 +56,6 @@ abstract class Event{ throw new \BadMethodCallException(get_class($this) . " is not Cancellable"); } - /** @var Event $this */ return $this->isCancelled; } @@ -70,7 +69,6 @@ abstract class Event{ throw new \BadMethodCallException(get_class($this) . " is not Cancellable"); } - /** @var Event $this */ $this->isCancelled = $value; } 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); } /** 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; /** 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(); diff --git a/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php b/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php index 0a94ca9a8..d4ef733e9 100644 --- a/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php +++ b/src/pocketmine/network/mcpe/protocol/AvailableCommandsPacket.php @@ -434,12 +434,9 @@ class AvailableCommandsPacket extends DataPacket{ if($commandData->aliases !== null){ $addEnumFn($commandData->aliases); } - + /** @var CommandParameter[] $overload */ foreach($commandData->overloads as $overload){ - /** - * @var CommandParameter[] $overload - * @var CommandParameter $parameter - */ + /** @var CommandParameter $parameter */ foreach($overload as $parameter){ if($parameter->enum !== null){ $addEnumFn($parameter->enum); diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index ee92644b3..0c2abdb27 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -733,7 +733,7 @@ class PluginManager{ $eventClass = $parameters[0]->getClass(); }catch(\ReflectionException $e){ //class doesn't exist if(isset($tags["softDepend"]) && !isset($this->plugins[$tags["softDepend"]])){ - $this->server->getLogger()->debug("Not registering @softDepend listener " . Utils::getNiceClosureName($handlerClosure) . "(" . $parameters[0]->getType()->getName() . ") because plugin \"" . $tags["softDepend"] . "\" not found"); + $this->server->getLogger()->debug("Not registering @softDepend listener " . Utils::getNiceClosureName($handlerClosure) . "() because plugin \"" . $tags["softDepend"] . "\" not found"); continue; } 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/optional-com-dotnet.neon b/tests/phpstan/configs/optional-com-dotnet.neon index efa2d82ab..fb725539c 100644 --- a/tests/phpstan/configs/optional-com-dotnet.neon +++ b/tests/phpstan/configs/optional-com-dotnet.neon @@ -3,10 +3,10 @@ parameters: - message: "#^Instantiated class COM not found\\.$#" count: 2 - path: src/pocketmine/network/upnp/UPnP.php + path: ../../../src/pocketmine/network/upnp/UPnP.php - message: "#^Access to property \\$StaticPortMappingCollection on an unknown class COM\\.$#" count: 4 - path: src/pocketmine/network/upnp/UPnP.php + path: ../../../src/pocketmine/network/upnp/UPnP.php diff --git a/tests/phpstan/configs/optional-leveldb.neon b/tests/phpstan/configs/optional-leveldb.neon index 7ad8f1e28..91ff01bb5 100644 --- a/tests/phpstan/configs/optional-leveldb.neon +++ b/tests/phpstan/configs/optional-leveldb.neon @@ -2,29 +2,29 @@ parameters: ignoreErrors: - message: "#^Used constant LEVELDB_ZLIB_RAW_COMPRESSION not found\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Constant LEVELDB_ZLIB_RAW_COMPRESSION not found\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Instantiated class LevelDB not found\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Return typehint of method pocketmine\\\\level\\\\format\\\\io\\\\leveldb\\\\LevelDB\\:\\:createDB\\(\\) has invalid type LevelDB\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Return typehint of method pocketmine\\\\level\\\\format\\\\io\\\\leveldb\\\\LevelDB\\:\\:getDatabase\\(\\) has invalid type LevelDB\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Property pocketmine\\\\level\\\\format\\\\io\\\\leveldb\\\\LevelDB\\:\\:\\$db has unknown class LevelDB as its type\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php - message: "#^Call to method (get|put|delete|close)\\(\\) on an unknown class LevelDB\\.$#" - path: src/pocketmine/level/format/io/leveldb/LevelDB.php + path: ../../../src/pocketmine/level/format/io/leveldb/LevelDB.php diff --git a/tests/phpstan/configs/phpstan-bugs.neon b/tests/phpstan/configs/phpstan-bugs.neon index 90fef5cea..696fcc8ab 100644 --- a/tests/phpstan/configs/phpstan-bugs.neon +++ b/tests/phpstan/configs/phpstan-bugs.neon @@ -1,10 +1,33 @@ parameters: ignoreErrors: - - message: "#^PHPDoc tag @param has invalid value \\(.+\\)\\: Unexpected token \"&\", expected TOKEN_VARIABLE at offset \\d+$#" - path: src/pocketmine + message: "#^PHPDoc tag @param has invalid value \\(.+\\)\\: Unexpected token \"&\", expected variable at offset \\d+$#" + path: ../../../src - message: "#^Default value of the parameter \\#\\d+ \\$[A-Za-z\\d_]+ \\(\\-?\\d+\\) of method .+\\(\\) is incompatible with type float\\.$#" - path: src/pocketmine + path: ../../../src + + - + message: "#^Cannot access an offset on Threaded\\.$#" + path: ../../../src + + - + 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 diff --git a/tests/phpstan/configs/pthreads-bugs.neon b/tests/phpstan/configs/pthreads-bugs.neon index 65979a989..3b4bcadcb 100644 --- a/tests/phpstan/configs/pthreads-bugs.neon +++ b/tests/phpstan/configs/pthreads-bugs.neon @@ -2,5 +2,5 @@ parameters: ignoreErrors: - message: "#^Variable \\$GLOBALS in isset\\(\\) always exists and is not nullable\\.$#" - path: src/pocketmine/MemoryManager.php + path: ../../../src/pocketmine/MemoryManager.php diff --git a/tests/travis.sh b/tests/travis.sh index a58341493..ba90d4a19 100755 --- a/tests/travis.sh +++ b/tests/travis.sh @@ -21,7 +21,7 @@ if [ $? -ne 0 ]; then exit 1 fi -[ ! -f phpstan.phar ] && echo "Downloading PHPStan..." && curl -sSLO https://github.com/phpstan/phpstan/releases/download/0.11.19/phpstan.phar +[ ! -f phpstan.phar ] && echo "Downloading PHPStan..." && curl -sSLO https://github.com/phpstan/phpstan/releases/download/0.12.0/phpstan.phar "$PHP_BINARY" phpstan.phar analyze --no-progress --memory-limit=2G || exit 1 echo "PHPStan scan succeeded"