From a18b24e01c7756f5f3c16446613392c5a3d24b8d Mon Sep 17 00:00:00 2001 From: "John Paul E. Balandan, CPA" Date: Mon, 24 Aug 2026 02:18:18 +0800 Subject: [PATCH] refactor: fix phpstan errors in `Debug` --- system/Debug/BaseExceptionHandler.php | 20 +- system/Debug/Exceptions.php | 14 +- system/Debug/Iterator.php | 4 +- system/Debug/Timer.php | 4 +- system/Debug/Toolbar.php | 16 +- .../Toolbar/Collectors/BaseCollector.php | 22 +- system/Debug/Toolbar/Collectors/Config.php | 11 + system/Debug/Toolbar/Collectors/Database.php | 23 +- system/Debug/Toolbar/Collectors/Events.php | 4 + system/Debug/Toolbar/Collectors/Files.php | 2 + system/Debug/Toolbar/Collectors/History.php | 22 +- system/Debug/Toolbar/Collectors/Timers.php | 2 + system/Debug/Toolbar/Collectors/Views.php | 12 +- tests/system/Debug/ExceptionHandlerTest.php | 6 +- tests/system/Debug/TimerTest.php | 2 +- user_guide_src/source/changelogs/v4.7.5.rst | 2 + utils/phpstan-baseline/argument.type.neon | 7 +- utils/phpstan-baseline/loader.neon | 2 +- utils/phpstan-baseline/method.notFound.neon | 17 +- .../missingType.iterableValue.neon | 237 +----------------- 20 files changed, 151 insertions(+), 278 deletions(-) diff --git a/system/Debug/BaseExceptionHandler.php b/system/Debug/BaseExceptionHandler.php index b9180a98bd59..6adaa8eaaca9 100644 --- a/system/Debug/BaseExceptionHandler.php +++ b/system/Debug/BaseExceptionHandler.php @@ -70,6 +70,16 @@ abstract public function handle( /** * Gathers the variables that will be made available to the view. + * + * @return array{ + * title: string, + * type: string, + * code: int, + * message: string, + * file: string, + * line: int, + * trace: list>, + * } */ protected function collectVars(Throwable $exception, int $statusCode): array { @@ -99,6 +109,11 @@ protected function collectVars(Throwable $exception, int $statusCode): array /** * Mask sensitive data in the trace. + * + * @param list> $trace + * @param list $keysToMask + * + * @return list> */ protected function maskSensitiveData(array $trace, array $keysToMask, string $path = ''): array { @@ -110,9 +125,10 @@ protected function maskSensitiveData(array $trace, array $keysToMask, string $pa } /** - * @param array|object $args + * @param array|object $args + * @param list $keysToMask * - * @return array|object + * @return array|object */ private function maskData($args, array $keysToMask, string $path = '') { diff --git a/system/Debug/Exceptions.php b/system/Debug/Exceptions.php index 3c8b1f006ea7..74092b627963 100644 --- a/system/Debug/Exceptions.php +++ b/system/Debug/Exceptions.php @@ -355,6 +355,8 @@ protected function render(Throwable $exception, int $statusCode) /** * Gathers the variables that will be made available to the view. * + * @return array{title: string, type: string, code: int, message: string, file: string, line: int, trace: list>} + * * @deprecated 4.4.0 No longer used. Moved to BaseExceptionHandler. */ protected function collectVars(Throwable $exception, int $statusCode): array @@ -386,9 +388,10 @@ protected function collectVars(Throwable $exception, int $statusCode): array /** * Mask sensitive data in the trace. * - * @param array $trace + * @param list> $trace + * @param list $keysToMask * - * @return array + * @return list> * * @deprecated 4.4.0 No longer used. Moved to BaseExceptionHandler. */ @@ -402,9 +405,10 @@ protected function maskSensitiveData($trace, array $keysToMask, string $path = ' } /** - * @param array|object $args + * @param array|object $args + * @param list $keysToMask * - * @return array|object + * @return array|object * * @deprecated 4.4.0 No longer used. Moved to BaseExceptionHandler. */ @@ -441,6 +445,8 @@ private function maskData($args, array $keysToMask, string $path = '') /** * Determines the HTTP status code and the exit status code for this request. + * + * @return array{int, int} */ protected function determineCodes(Throwable $exception): array { diff --git a/system/Debug/Iterator.php b/system/Debug/Iterator.php index 55ee0f3bce8b..07a6d6d3689f 100644 --- a/system/Debug/Iterator.php +++ b/system/Debug/Iterator.php @@ -23,14 +23,14 @@ class Iterator /** * Stores the tests that we are to run. * - * @var array + * @var array */ protected $tests = []; /** * Stores the results of each of the tests. * - * @var array + * @var array */ protected $results = []; diff --git a/system/Debug/Timer.php b/system/Debug/Timer.php index 45be554ea7ce..be4b56ce7cc8 100644 --- a/system/Debug/Timer.php +++ b/system/Debug/Timer.php @@ -28,7 +28,7 @@ class Timer /** * List of all timers. * - * @var array + * @var array */ protected $timers = []; @@ -107,6 +107,8 @@ public function getElapsedTime(string $name, int $decimals = 4) * Returns the array of timers, with the duration pre-calculated for you. * * @param int $decimals Number of decimal places + * + * @return array */ public function getTimers(int $decimals = 4): array { diff --git a/system/Debug/Toolbar.php b/system/Debug/Toolbar.php index 311a41a2bf9d..d38cfcb20e4e 100644 --- a/system/Debug/Toolbar.php +++ b/system/Debug/Toolbar.php @@ -190,6 +190,9 @@ public function run(float $startTime, float $totalTime, RequestInterface $reques /** * Called within the view to display the timeline itself. + * + * @param list>}> $collectors + * @param array $styles */ protected function renderTimeline(array $collectors, float $startTime, int $segmentCount, int $segmentDuration, array &$styles): string { @@ -202,6 +205,9 @@ protected function renderTimeline(array $collectors, float $startTime, int $segm /** * Recursively renders timeline elements and their children. + * + * @param list> $rows + * @param array $styles */ protected function renderTimelineRecursive(array $rows, float $startTime, int $segmentCount, int $segmentDuration, array &$styles, int &$styleCount, int $level = 0, bool $isChild = false): string { @@ -268,7 +274,9 @@ protected function renderTimelineRecursive(array $rows, float $startTime, int $s /** * Returns a sorted array of timeline data arrays from the collectors. * - * @param array $collectors + * @param list>}> $collectors + * + * @return list> */ protected function collectTimelineData($collectors): array { @@ -305,6 +313,10 @@ protected function collectTimelineData($collectors): array /** * Arranges the already sorted timeline data into a parent => child structure. + * + * @param list> $elements + * + * @return list> */ protected function structureTimelineData(array $elements): array { @@ -333,6 +345,8 @@ protected function structureTimelineData(array $elements): array /** * Returns an array of data from all of the modules * that should be displayed in the 'Vars' tab. + * + * @return array */ protected function collectVarData(): array { diff --git a/system/Debug/Toolbar/Collectors/BaseCollector.php b/system/Debug/Toolbar/Collectors/BaseCollector.php index 81cc631f98e7..05fdbf71a95e 100644 --- a/system/Debug/Toolbar/Collectors/BaseCollector.php +++ b/system/Debug/Toolbar/Collectors/BaseCollector.php @@ -105,6 +105,8 @@ public function hasTimelineData(): bool /** * Grabs the data for the timeline, properly formatted, * or returns an empty array. + * + * @return list> */ public function timelineData(): array { @@ -140,7 +142,7 @@ public function hasVarData(): bool * ], * ]; * - * @return array|null + * @return array|null */ public function getVarData() { @@ -159,6 +161,8 @@ public function getVarData() * 'start' => 10 // milliseconds * 'duration' => 15 // milliseconds * ] + * + * @return list> */ protected function formatTimelineData(): array { @@ -168,7 +172,7 @@ protected function formatTimelineData(): array /** * Returns the data of this collector to be formatted in the toolbar * - * @return array|string + * @return array|string */ public function display() { @@ -218,6 +222,20 @@ public function icon(): string /** * Return settings as an array. + * + * @return array{ + * title: string, + * titleSafe: string, + * titleDetails: string, + * display: array|string, + * badgeValue: int|null, + * isEmpty: bool, + * hasTabContent: bool, + * hasLabel: bool, + * icon: string, + * hasTimelineData: bool, + * timelineData: list>, + * } */ public function getAsArray(): array { diff --git a/system/Debug/Toolbar/Collectors/Config.php b/system/Debug/Toolbar/Collectors/Config.php index 80673f979f6c..d806858728dc 100644 --- a/system/Debug/Toolbar/Collectors/Config.php +++ b/system/Debug/Toolbar/Collectors/Config.php @@ -23,6 +23,17 @@ class Config { /** * Return toolbar config values as an array. + * + * @return array{ + * ciVersion: string, + * phpVersion: string, + * phpSAPI: string, + * environment: string, + * baseURL: string, + * timezone: string, + * locale: string, + * cspEnabled: bool, + * } */ public static function display(): array { diff --git a/system/Debug/Toolbar/Collectors/Database.php b/system/Debug/Toolbar/Collectors/Database.php index 4d5a06f40486..6ab1094c2918 100644 --- a/system/Debug/Toolbar/Collectors/Database.php +++ b/system/Debug/Toolbar/Collectors/Database.php @@ -13,6 +13,7 @@ namespace CodeIgniter\Debug\Toolbar\Collectors; +use CodeIgniter\Database\BaseConnection; use CodeIgniter\Database\Query; use CodeIgniter\I18n\Time; use Config\Toolbar; @@ -55,7 +56,7 @@ class Database extends BaseCollector /** * Array of database connections. * - * @var array + * @var array */ protected $connections; @@ -63,7 +64,7 @@ class Database extends BaseCollector * The query instances that have been collected * through the DBQuery Event. * - * @var array + * @var list>}> */ protected static $queries = []; @@ -113,7 +114,13 @@ public static function collect(Query $query) /** * Returns timeline data formatted for the toolbar. * - * @return array The formatted data or an empty array. + * @return list */ protected function formatTimelineData(): array { @@ -144,6 +151,16 @@ protected function formatTimelineData(): array /** * Returns the data of this collector to be formatted in the toolbar + * + * @return array{queries: list>, + * trace-file: string, + * qid: string + * }>} */ public function display(): array { diff --git a/system/Debug/Toolbar/Collectors/Events.php b/system/Debug/Toolbar/Collectors/Events.php index 173c71a32733..46d20083c0bd 100644 --- a/system/Debug/Toolbar/Collectors/Events.php +++ b/system/Debug/Toolbar/Collectors/Events.php @@ -53,6 +53,8 @@ class Events extends BaseCollector /** * Child classes should implement this to return the timeline data * formatted for correct usage. + * + * @return list */ protected function formatTimelineData(): array { @@ -74,6 +76,8 @@ protected function formatTimelineData(): array /** * Returns the data of this collector to be formatted in the toolbar + * + * @return array{events: array} */ public function display(): array { diff --git a/system/Debug/Toolbar/Collectors/Files.php b/system/Debug/Toolbar/Collectors/Files.php index a573388f960e..35e345c04fc4 100644 --- a/system/Debug/Toolbar/Collectors/Files.php +++ b/system/Debug/Toolbar/Collectors/Files.php @@ -52,6 +52,8 @@ public function getTitleDetails(): string /** * Returns the data of this collector to be formatted in the toolbar + * + * @return array{coreFiles: list, userFiles: list} */ public function display(): array { diff --git a/system/Debug/Toolbar/Collectors/History.php b/system/Debug/Toolbar/Collectors/History.php index 583b350cb4b6..a0575feba9e8 100644 --- a/system/Debug/Toolbar/Collectors/History.php +++ b/system/Debug/Toolbar/Collectors/History.php @@ -55,7 +55,16 @@ class History extends BaseCollector protected $title = 'History'; /** - * @var array History files + * @var list */ protected $files = []; @@ -111,6 +120,17 @@ public function setFiles(string $current, int $limit = 20) /** * Returns the data of this collector to be formatted in the toolbar + * + * @return array{files: list} */ public function display(): array { diff --git a/system/Debug/Toolbar/Collectors/Timers.php b/system/Debug/Toolbar/Collectors/Timers.php index d450cc5c306a..9e86af2c8d9d 100644 --- a/system/Debug/Toolbar/Collectors/Timers.php +++ b/system/Debug/Toolbar/Collectors/Timers.php @@ -45,6 +45,8 @@ class Timers extends BaseCollector /** * Child classes should implement this to return the timeline data * formatted for correct usage. + * + * @return list */ protected function formatTimelineData(): array { diff --git a/system/Debug/Toolbar/Collectors/Views.php b/system/Debug/Toolbar/Collectors/Views.php index a63e172c3b8a..bae742a588a2 100644 --- a/system/Debug/Toolbar/Collectors/Views.php +++ b/system/Debug/Toolbar/Collectors/Views.php @@ -14,6 +14,7 @@ namespace CodeIgniter\Debug\Toolbar\Collectors; use CodeIgniter\View\RendererInterface; +use CodeIgniter\View\View; /** * Views collector @@ -70,10 +71,15 @@ class Views extends BaseCollector /** * Views counter * - * @var array + * @var array{} + * + * @deprecated 4.7.5 Unused. */ protected $views = []; + /** + * @phpstan-assert View $this->viewer + */ private function initViewer(): void { $this->viewer ??= service('renderer'); @@ -82,6 +88,8 @@ private function initViewer(): void /** * Child classes should implement this to return the timeline data * formatted for correct usage. + * + * @return list */ protected function formatTimelineData(): array { @@ -118,6 +126,8 @@ protected function formatTimelineData(): array * 'bar' => 'baz' * ], * ]; + * + * @return array> */ public function getVarData(): array { diff --git a/tests/system/Debug/ExceptionHandlerTest.php b/tests/system/Debug/ExceptionHandlerTest.php index 43086860b0d6..59eaa8c203d6 100644 --- a/tests/system/Debug/ExceptionHandlerTest.php +++ b/tests/system/Debug/ExceptionHandlerTest.php @@ -16,6 +16,7 @@ use App\Controllers\Home; use CodeIgniter\Exceptions\PageNotFoundException; use CodeIgniter\Exceptions\RuntimeException; +use CodeIgniter\HTTP\Response; use CodeIgniter\Test\CIUnitTestCase; use CodeIgniter\Test\IniTestTrait; use CodeIgniter\Test\StreamFilterTrait; @@ -110,7 +111,8 @@ public function testHandleWebPageNotFoundExceptionDoNotAcceptHTML(): void { $exception = PageNotFoundException::forControllerNotFound('Foo', 'bar'); - $request = service('incomingrequest', null, false); + $request = service('incomingrequest', null, false); + /** @var Response $response */ $response = service('response', null, false); $response->pretend(); @@ -131,6 +133,7 @@ public function testHandleWebPageNotFoundExceptionAcceptHTML(): void $request = service('incomingrequest', null, false); $request->setHeader('accept', 'text/html'); + /** @var Response $response */ $response = service('response', null, false); $response->pretend(); @@ -147,6 +150,7 @@ public function testHandleCLIPageNotFoundException(): void $request = Services::clirequest(null, false); $request->setHeader('accept', 'text/html'); + /** @var Response $response */ $response = service('response', null, false); $response->pretend(); diff --git a/tests/system/Debug/TimerTest.php b/tests/system/Debug/TimerTest.php index 756c2ce50340..0f28e7dba69b 100644 --- a/tests/system/Debug/TimerTest.php +++ b/tests/system/Debug/TimerTest.php @@ -176,7 +176,7 @@ public function testRecordThrowsErrorOnCallableWithParams(): void $this->expectException(ArgumentCountError::class); $timer = new Timer(); - $timer->record('error', 'strlen'); + $timer->record('error', 'strlen'); // @phpstan-ignore argument.type (Needed for testing) } public function testCommonNoNameExpectTimer(): void diff --git a/user_guide_src/source/changelogs/v4.7.5.rst b/user_guide_src/source/changelogs/v4.7.5.rst index 9495108b28a6..b5f11bc83f79 100644 --- a/user_guide_src/source/changelogs/v4.7.5.rst +++ b/user_guide_src/source/changelogs/v4.7.5.rst @@ -26,6 +26,8 @@ Changes Deprecations ************ +- **Debug Toolbar:** Deprecated the unused ``CodeIgniter\Debug\Toolbar\Collectors\Views::$views`` property. + ********** Bugs Fixed ********** diff --git a/utils/phpstan-baseline/argument.type.neon b/utils/phpstan-baseline/argument.type.neon index 5e3cd39db63c..e72c009d6298 100644 --- a/utils/phpstan-baseline/argument.type.neon +++ b/utils/phpstan-baseline/argument.type.neon @@ -1,4 +1,4 @@ -# total 31 errors +# total 30 errors parameters: ignoreErrors: @@ -52,11 +52,6 @@ parameters: count: 2 path: ../../tests/system/Database/Live/UpsertTest.php - - - message: '#^Parameter \#2 \$callable of method CodeIgniter\\Debug\\Timer\:\:record\(\) expects callable\(\)\: mixed, ''strlen'' given\.$#' - count: 1 - path: ../../tests/system/Debug/TimerTest.php - - message: '#^Parameter \#1 \$num of function number_to_size expects int\|string, float given\.$#' count: 1 diff --git a/utils/phpstan-baseline/loader.neon b/utils/phpstan-baseline/loader.neon index 947f86255805..d017c3f9b903 100644 --- a/utils/phpstan-baseline/loader.neon +++ b/utils/phpstan-baseline/loader.neon @@ -1,4 +1,4 @@ -# total 539 errors +# total 485 errors includes: - argument.type.neon diff --git a/utils/phpstan-baseline/method.notFound.neon b/utils/phpstan-baseline/method.notFound.neon index 5fbb5963bf85..97c2353c3ea4 100644 --- a/utils/phpstan-baseline/method.notFound.neon +++ b/utils/phpstan-baseline/method.notFound.neon @@ -1,17 +1,7 @@ -# total 27 errors +# total 21 errors parameters: ignoreErrors: - - - message: '#^Call to an undefined method CodeIgniter\\View\\RendererInterface\:\:getData\(\)\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Views.php - - - - message: '#^Call to an undefined method CodeIgniter\\View\\RendererInterface\:\:getPerformanceData\(\)\.$#' - count: 2 - path: ../../system/Debug/Toolbar/Collectors/Views.php - - message: '#^Call to an undefined method CodeIgniter\\HTTP\\ResponseInterface\:\:pretend\(\)\.$#' count: 1 @@ -22,11 +12,6 @@ parameters: count: 2 path: ../../tests/system/Commands/Utilities/Routes/FilterFinderTest.php - - - message: '#^Call to an undefined method CodeIgniter\\HTTP\\ResponseInterface\:\:pretend\(\)\.$#' - count: 3 - path: ../../tests/system/Debug/ExceptionHandlerTest.php - - message: '#^Call to an undefined method org\\bovigo\\vfs\\visitor\\vfsStreamVisitor\:\:getStructure\(\)\.$#' count: 2 diff --git a/utils/phpstan-baseline/missingType.iterableValue.neon b/utils/phpstan-baseline/missingType.iterableValue.neon index 51c988f3992a..fee6f02c8294 100644 --- a/utils/phpstan-baseline/missingType.iterableValue.neon +++ b/utils/phpstan-baseline/missingType.iterableValue.neon @@ -1,4 +1,4 @@ -# total 387 errors +# total 340 errors parameters: ignoreErrors: @@ -317,241 +317,6 @@ parameters: count: 1 path: ../../system/DataConverter/DataConverter.php - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:collectVars\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskData\(\) has parameter \$args with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskData\(\) has parameter \$keysToMask with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskSensitiveData\(\) has parameter \$keysToMask with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskSensitiveData\(\) has parameter \$trace with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\BaseExceptionHandler\:\:maskSensitiveData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/BaseExceptionHandler.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:collectVars\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:determineCodes\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskData\(\) has parameter \$args with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskData\(\) has parameter \$keysToMask with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskSensitiveData\(\) has parameter \$keysToMask with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskSensitiveData\(\) has parameter \$trace with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Method CodeIgniter\\Debug\\Exceptions\:\:maskSensitiveData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Exceptions.php - - - - message: '#^Property CodeIgniter\\Debug\\Iterator\:\:\$results type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Iterator.php - - - - message: '#^Property CodeIgniter\\Debug\\Iterator\:\:\$tests type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Iterator.php - - - - message: '#^Method CodeIgniter\\Debug\\Timer\:\:getTimers\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Timer.php - - - - message: '#^Property CodeIgniter\\Debug\\Timer\:\:\$timers type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Timer.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:collectTimelineData\(\) has parameter \$collectors with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:collectTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:collectVarData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:renderTimelineRecursive\(\) has parameter \$rows with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:renderTimelineRecursive\(\) has parameter \$styles with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:renderTimeline\(\) has parameter \$collectors with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:renderTimeline\(\) has parameter \$styles with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:structureTimelineData\(\) has parameter \$elements with no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\:\:structureTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/BaseCollector.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector\:\:formatTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/BaseCollector.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector\:\:getAsArray\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/BaseCollector.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector\:\:getVarData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/BaseCollector.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\BaseCollector\:\:timelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/BaseCollector.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Config\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Config.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Database\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Database.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Database\:\:formatTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Database.php - - - - message: '#^Property CodeIgniter\\Debug\\Toolbar\\Collectors\\Database\:\:\$connections type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Database.php - - - - message: '#^Property CodeIgniter\\Debug\\Toolbar\\Collectors\\Database\:\:\$queries type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Database.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Events\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Events.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Events\:\:formatTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Events.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Files\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Files.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\History\:\:display\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/History.php - - - - message: '#^Property CodeIgniter\\Debug\\Toolbar\\Collectors\\History\:\:\$files type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/History.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Timers\:\:formatTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Timers.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Views\:\:formatTimelineData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Views.php - - - - message: '#^Method CodeIgniter\\Debug\\Toolbar\\Collectors\\Views\:\:getVarData\(\) return type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Views.php - - - - message: '#^Property CodeIgniter\\Debug\\Toolbar\\Collectors\\Views\:\:\$views type has no value type specified in iterable type array\.$#' - count: 1 - path: ../../system/Debug/Toolbar/Collectors/Views.php - - message: '#^Method CodeIgniter\\Email\\Email\:\:__construct\(\) has parameter \$config with no value type specified in iterable type array\.$#' count: 1