Viewing file: Xdebug3Driver.php (3.14 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?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 XDEBUG_CC_BRANCH_CHECK; use const XDEBUG_CC_DEAD_CODE; use const XDEBUG_CC_UNUSED; use const XDEBUG_FILTER_CODE_COVERAGE; use const XDEBUG_PATH_INCLUDE; use function explode; use function extension_loaded; use function getenv; use function in_array; use function ini_get; use function phpversion; use function sprintf; use function version_compare; use function xdebug_get_code_coverage; use function xdebug_set_filter; use function xdebug_start_code_coverage; use function xdebug_stop_code_coverage; use SebastianBergmann\CodeCoverage\Filter; use SebastianBergmann\CodeCoverage\RawCodeCoverageData;
/** * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage */ final class Xdebug3Driver extends Driver { /** * @throws WrongXdebugVersionException * @throws Xdebug3NotEnabledException * @throws XdebugNotAvailableException */ public function __construct(Filter $filter) { if (!extension_loaded('xdebug')) { throw new XdebugNotAvailableException; }
if (version_compare(phpversion('xdebug'), '3', '<')) { throw new WrongXdebugVersionException( sprintf( 'This driver requires Xdebug 3 but version %s is loaded', phpversion('xdebug') ) ); }
$mode = getenv('XDEBUG_MODE');
if ($mode === false || $mode === '') { $mode = ini_get('xdebug.mode'); }
if ($mode === false || !in_array('coverage', explode(',', $mode), true)) { throw new Xdebug3NotEnabledException; }
if (!$filter->isEmpty()) { xdebug_set_filter( XDEBUG_FILTER_CODE_COVERAGE, XDEBUG_PATH_INCLUDE, $filter->files() ); } }
public function canCollectBranchAndPathCoverage(): bool { return true; }
public function canDetectDeadCode(): bool { return true; }
public function start(): void { $flags = XDEBUG_CC_UNUSED;
if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_DEAD_CODE; }
if ($this->collectsBranchAndPathCoverage()) { $flags |= XDEBUG_CC_BRANCH_CHECK; }
xdebug_start_code_coverage($flags); }
public function stop(): RawCodeCoverageData { $data = xdebug_get_code_coverage();
xdebug_stop_code_coverage();
if ($this->collectsBranchAndPathCoverage()) { return RawCodeCoverageData::fromXdebugWithPathCoverage($data); }
return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); }
public function nameAndVersion(): string { return 'Xdebug ' . phpversion('xdebug'); } }
|