includes:
	- tests/phpstan/configs/com-dotnet-magic.neon
	- tests/phpstan/configs/custom-leveldb.neon
	- tests/phpstan/configs/ds-bugs.neon
	- tests/phpstan/configs/gc-hacks.neon
	- tests/phpstan/configs/php-bugs.neon
	- tests/phpstan/configs/phpstan-bugs.neon
	- tests/phpstan/configs/phpunit-wiring-tests.neon
	- tests/phpstan/configs/pthreads-bugs.neon
	- tests/phpstan/configs/runtime-type-checks.neon
	- vendor/phpstan/phpstan-phpunit/extension.neon
	- vendor/phpstan/phpstan-phpunit/rules.neon
	- vendor/phpstan/phpstan-strict-rules/rules.neon

rules:
	- pocketmine\phpstan\rules\DisallowEnumComparisonRule

parameters:
	level: 6
	autoload_files:
		- tests/phpstan/bootstrap.php
		- src/PocketMine.php
		- build/make-release.php
		- build/server-phar.php
		- vendor/irstea/phpunit-shim/phpunit
	paths:
		- src
		- tests/phpstan/rules
		- build/make-release.php
		- build/server-phar.php
		- tests/phpunit
	dynamicConstantNames:
		- pocketmine\IS_DEVELOPMENT_BUILD
		- pocketmine\DEBUG
	stubFiles:
		- tests/phpstan/stubs/JsonMapper.stub
		- tests/phpstan/stubs/pthreads.stub
	reportUnmatchedIgnoredErrors: false #no other way to silence platform-specific non-warnings
	staticReflectionClassNamePatterns:
		- "#^COM$#"
	ignoreErrors:
		-
			message: "#^Instanceof between pocketmine\\\\plugin\\\\PluginManager and pocketmine\\\\plugin\\\\PluginManager will always evaluate to true\\.$#"
			count: 1
			path: src/CrashDump.php

		-
			message: "#^Function parallel\\\\bootstrap not found\\.$#"
			count: 1
			path: src/PocketMine.php

		-
			message: "#^Instanceof between pocketmine\\\\plugin\\\\PluginManager and pocketmine\\\\plugin\\\\PluginManager will always evaluate to true\\.$#"
			count: 1
			path: src/Server.php

		-
			message: "#^Instanceof between pocketmine\\\\scheduler\\\\AsyncPool and pocketmine\\\\scheduler\\\\AsyncPool will always evaluate to true\\.$#"
			count: 1
			path: src/Server.php

		-
			message: "#^Instanceof between pocketmine\\\\command\\\\CommandReader and pocketmine\\\\command\\\\CommandReader will always evaluate to true\\.$#"
			count: 1
			path: src/Server.php

		-
			message: "#^Instanceof between pocketmine\\\\network\\\\Network and pocketmine\\\\network\\\\Network will always evaluate to true\\.$#"
			count: 2
			path: src/Server.php

		-
			message: "#^Instanceof between pocketmine\\\\world\\\\WorldManager and pocketmine\\\\world\\\\WorldManager will always evaluate to true\\.$#"
			count: 1
			path: src/Server.php

		-
			message: "#^Call to an undefined method pocketmine\\\\command\\\\CommandSender\\:\\:teleport\\(\\)\\.$#"
			count: 1
			path: src/command/defaults/TeleportCommand.php
#			comment: "not actually possible, but high cost to fix warning"

		-
			message: "#^Method pocketmine\\\\event\\\\entity\\\\EntityDeathEvent\\:\\:getEntity\\(\\) should return pocketmine\\\\entity\\\\Living but returns pocketmine\\\\entity\\\\Entity\\.$#"
			count: 1
			path: src/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/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/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/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/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/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/event/entity/ProjectileLaunchEvent.php

		-
			message: "#^pocketmine\\\\inventory\\\\DoubleChestInventory\\:\\:__construct\\(\\) does not call parent constructor from pocketmine\\\\inventory\\\\ChestInventory\\.$#"
			count: 1
			path: src/inventory/DoubleChestInventory.php

		-
			message: "#^Cannot instantiate interface pocketmine\\\\world\\\\format\\\\io\\\\WorldProvider\\.$#"
			count: 1
			path: src/world/WorldManager.php

		-
			message: "#^Cannot instantiate interface pocketmine\\\\world\\\\format\\\\io\\\\WritableWorldProvider\\.$#"
			count: 1
			path: src/world/WorldManager.php

		-
			message: "#^Variable property access on \\$this\\(pocketmine\\\\world\\\\generator\\\\PopulationTask\\)\\.$#"
			count: 4
			path: src/world/generator/PopulationTask.php

		-
			message: "#^Cannot instantiate interface pocketmine\\\\world\\\\format\\\\io\\\\WritableWorldProvider\\.$#"
			count: 2
			path: src/world/format/io/FormatConverter.php

		-
			message: "#^Constant pocketmine\\\\COMPOSER_AUTOLOADER_PATH not found\\.$#"
			path: src

		-
			message: "#^Constant pocketmine\\\\GIT_COMMIT not found\\.$#"
			path: src

		-
			message: "#^Constant pocketmine\\\\PLUGIN_PATH not found\\.$#"
			path: src

		-
			message: "#^Constant pocketmine\\\\VERSION not found\\.$#"
			path: src