Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php declare(strict_types=1);/** This file is part of phpunit/php-code-coverage.** (c) Sebastian Bergmann <sebastian@phpunit.de>** For the full copyright and license information, please view the LICENSE* file that was distributed with this source code.*/namespace SebastianBergmann\CodeCoverage\Driver;use const PHP_SAPI;use const PHP_VERSION;use function array_diff;use function array_keys;use function array_merge;use function get_included_files;use function phpdbg_end_oplog;use function phpdbg_get_executable;use function phpdbg_start_oplog;use SebastianBergmann\CodeCoverage\RawCodeCoverageData;/*** @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage*/final class PhpdbgDriver extends Driver{/*** @throws PhpdbgNotAvailableException*/public function __construct(){if (PHP_SAPI !== 'phpdbg') {throw new PhpdbgNotAvailableException;}}public function start(): void{phpdbg_start_oplog();}public function stop(): RawCodeCoverageData{static $fetchedLines = [];$dbgData = phpdbg_end_oplog();if ($fetchedLines === []) {$sourceLines = phpdbg_get_executable();} else {$newFiles = array_diff(get_included_files(), array_keys($fetchedLines));$sourceLines = [];if ($newFiles) {$sourceLines = phpdbg_get_executable(['files' => $newFiles]);}}foreach ($sourceLines as $file => $lines) {foreach ($lines as $lineNo => $numExecuted) {$sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED;}}$fetchedLines = array_merge($fetchedLines, $sourceLines);return RawCodeCoverageData::fromXdebugWithoutPathCoverage($this->detectExecutedLines($fetchedLines, $dbgData));}public function nameAndVersion(): string{return 'PHPDBG ' . PHP_VERSION;}private function detectExecutedLines(array $sourceLines, array $dbgData): array{foreach ($dbgData as $file => $coveredLines) {foreach ($coveredLines as $lineNo => $numExecuted) {// phpdbg also reports $lineNo=0 when e.g. exceptions get thrown.// make sure we only mark lines executed which are actually executable.if (isset($sourceLines[$file][$lineNo])) {$sourceLines[$file][$lineNo] = self::LINE_EXECUTED;}}}return $sourceLines;}}