Spaces:
Runtime error
Runtime error
| 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'); | |
| } | |
| } | |