Viewing file: Xdebug2Driver.php (3.44 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 const XDEBUG_PATH_WHITELIST; use function defined; use function extension_loaded; 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 Xdebug2Driver extends Driver { /** * @var bool */ private $pathCoverageIsMixedCoverage;
/** * @throws WrongXdebugVersionException * @throws Xdebug2NotEnabledException * @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 2 but version %s is loaded', phpversion('xdebug') ) ); }
if (!ini_get('xdebug.coverage_enable')) { throw new Xdebug2NotEnabledException; }
if (!$filter->isEmpty()) { if (defined('XDEBUG_PATH_WHITELIST')) { $listType = XDEBUG_PATH_WHITELIST; } else { $listType = XDEBUG_PATH_INCLUDE; }
xdebug_set_filter( XDEBUG_FILTER_CODE_COVERAGE, $listType, $filter->files() ); }
$this->pathCoverageIsMixedCoverage = version_compare(phpversion('xdebug'), '2.9.6', '<'); }
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()) { if ($this->pathCoverageIsMixedCoverage) { return RawCodeCoverageData::fromXdebugWithMixedCoverage($data); }
return RawCodeCoverageData::fromXdebugWithPathCoverage($data); }
return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); }
public function nameAndVersion(): string { return 'Xdebug ' . phpversion('xdebug'); } }
|