diff --git a/src/command/Command.php b/src/command/Command.php index 24180416b..7ae9ae7c1 100644 --- a/src/command/Command.php +++ b/src/command/Command.php @@ -31,8 +31,6 @@ use pocketmine\lang\KnownTranslationFactory; use pocketmine\lang\Translatable; use pocketmine\permission\PermissionManager; use pocketmine\Server; -use pocketmine\timings\Timings; -use pocketmine\timings\TimingsHandler; use pocketmine\utils\BroadcastLoggerForwarder; use pocketmine\utils\TextFormat; use function explode; @@ -60,8 +58,6 @@ abstract class Command{ private ?string $permission = null; private ?string $permissionMessage = null; - public ?TimingsHandler $timings = null; - /** * @param string[] $aliases */ @@ -136,7 +132,6 @@ abstract class Command{ public function setLabel(string $name) : bool{ $this->nextLabel = $name; if(!$this->isRegistered()){ - $this->timings = new TimingsHandler(Timings::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Command: " . $name); $this->label = $name; return true; diff --git a/src/command/FormattedCommandAlias.php b/src/command/FormattedCommandAlias.php index 21d2c0e70..b6b466451 100644 --- a/src/command/FormattedCommandAlias.php +++ b/src/command/FormattedCommandAlias.php @@ -26,6 +26,7 @@ namespace pocketmine\command; use pocketmine\command\utils\CommandStringHelper; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; +use pocketmine\timings\Timings; use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\TextFormat; use function array_map; @@ -82,14 +83,15 @@ class FormattedCommandAlias extends Command{ } if(($target = $commandMap->getCommand($commandLabel)) !== null){ - $target->timings->startTiming(); + $timings = Timings::getCommandDispatchTimings($target->getLabel()); + $timings->startTiming(); try{ $target->execute($sender, $commandLabel, $commandArgs); }catch(InvalidCommandSyntaxException $e){ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::commands_generic_usage($target->getUsage()))); }finally{ - $target->timings->stopTiming(); + $timings->stopTiming(); } }else{ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::pocketmine_command_notFound($commandLabel, "/help")->prefix(TextFormat::RED))); diff --git a/src/command/SimpleCommandMap.php b/src/command/SimpleCommandMap.php index 89824aa32..858cf4575 100644 --- a/src/command/SimpleCommandMap.php +++ b/src/command/SimpleCommandMap.php @@ -68,6 +68,7 @@ use pocketmine\command\utils\CommandStringHelper; use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\KnownTranslationFactory; use pocketmine\Server; +use pocketmine\timings\Timings; use pocketmine\utils\TextFormat; use function array_shift; use function count; @@ -199,7 +200,8 @@ class SimpleCommandMap implements CommandMap{ $sentCommandLabel = array_shift($args); if($sentCommandLabel !== null && ($target = $this->getCommand($sentCommandLabel)) !== null){ - $target->timings->startTiming(); + $timings = Timings::getCommandDispatchTimings($target->getLabel()); + $timings->startTiming(); try{ if($target->testPermission($sender)){ @@ -208,7 +210,7 @@ class SimpleCommandMap implements CommandMap{ }catch(InvalidCommandSyntaxException $e){ $sender->sendMessage($sender->getLanguage()->translate(KnownTranslationFactory::commands_generic_usage($target->getUsage()))); }finally{ - $target->timings->stopTiming(); + $timings->stopTiming(); } return true; } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 41ecd3bb1..d4b4f7560 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -93,6 +93,12 @@ abstract class Timings{ /** @var TimingsHandler[] */ public static array $pluginTaskTimingMap = []; + /** + * @var TimingsHandler[] + * @phpstan-var array + */ + private static array $commandTimingMap = []; + public static TimingsHandler $broadcastPackets; public static function init() : void{ @@ -227,4 +233,10 @@ abstract class Timings{ return self::$packetSendTimingMap[$pid]; } + + public static function getCommandDispatchTimings(string $commandName) : TimingsHandler{ + self::init(); + + return self::$commandTimingMap[$commandName] ??= new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "Command - " . $commandName); + } } diff --git a/tests/phpstan/configs/actual-problems.neon b/tests/phpstan/configs/actual-problems.neon index 638885452..893e2c1b4 100644 --- a/tests/phpstan/configs/actual-problems.neon +++ b/tests/phpstan/configs/actual-problems.neon @@ -470,26 +470,6 @@ parameters: count: 1 path: ../../../src/command/Command.php - - - message: "#^Cannot call method startTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/FormattedCommandAlias.php - - - - message: "#^Cannot call method stopTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/FormattedCommandAlias.php - - - - message: "#^Cannot call method startTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/SimpleCommandMap.php - - - - message: "#^Cannot call method stopTiming\\(\\) on pocketmine\\\\timings\\\\TimingsHandler\\|null\\.$#" - count: 1 - path: ../../../src/command/SimpleCommandMap.php - - message: "#^Cannot call method addParticle\\(\\) on pocketmine\\\\world\\\\World\\|null\\.$#" count: 1