Buckets:
| 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 version_compare; | |
| use function xdebug_get_code_coverage; | |
| use function xdebug_info; | |
| use function xdebug_set_filter; | |
| use function xdebug_start_code_coverage; | |
| use function xdebug_stop_code_coverage; | |
| use SebastianBergmann\CodeCoverage\Data\RawCodeCoverageData; | |
| use SebastianBergmann\CodeCoverage\Filter; | |
| /** | |
| * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage | |
| * | |
| * @see https://xdebug.org/docs/code_coverage#xdebug_get_code_coverage | |
| * | |
| * @psalm-type XdebugLinesCoverageType = array<int, int> | |
| * @psalm-type XdebugBranchCoverageType = array{ | |
| * op_start: int, | |
| * op_end: int, | |
| * line_start: int, | |
| * line_end: int, | |
| * hit: int, | |
| * out: array<int, int>, | |
| * out_hit: array<int, int>, | |
| * } | |
| * @psalm-type XdebugPathCoverageType = array{ | |
| * path: array<int, int>, | |
| * hit: int, | |
| * } | |
| * @psalm-type XdebugFunctionCoverageType = array{ | |
| * branches: array<int, XdebugBranchCoverageType>, | |
| * paths: array<int, XdebugPathCoverageType>, | |
| * } | |
| * @psalm-type XdebugFunctionsCoverageType = array<string, XdebugFunctionCoverageType> | |
| * @psalm-type XdebugPathAndBranchesCoverageType = array{ | |
| * lines: XdebugLinesCoverageType, | |
| * functions: XdebugFunctionsCoverageType, | |
| * } | |
| * @psalm-type XdebugCodeCoverageWithoutPathCoverageType = array<string, XdebugLinesCoverageType> | |
| * @psalm-type XdebugCodeCoverageWithPathCoverageType = array<string, XdebugPathAndBranchesCoverageType> | |
| */ | |
| final class XdebugDriver extends Driver | |
| { | |
| /** | |
| * @throws XdebugNotAvailableException | |
| * @throws XdebugNotEnabledException | |
| */ | |
| public function __construct(Filter $filter) | |
| { | |
| $this->ensureXdebugIsAvailable(); | |
| $this->ensureXdebugCodeCoverageFeatureIsEnabled(); | |
| 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()) { | |
| /* @var XdebugCodeCoverageWithPathCoverageType $data */ | |
| return RawCodeCoverageData::fromXdebugWithPathCoverage($data); | |
| } | |
| /* @var XdebugCodeCoverageWithoutPathCoverageType $data */ | |
| return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data); | |
| } | |
| public function nameAndVersion(): string | |
| { | |
| return 'Xdebug ' . phpversion('xdebug'); | |
| } | |
| /** | |
| * @throws XdebugNotAvailableException | |
| */ | |
| private function ensureXdebugIsAvailable(): void | |
| { | |
| if (!extension_loaded('xdebug')) { | |
| throw new XdebugNotAvailableException; | |
| } | |
| } | |
| /** | |
| * @throws XdebugNotEnabledException | |
| */ | |
| private function ensureXdebugCodeCoverageFeatureIsEnabled(): void | |
| { | |
| if (version_compare(phpversion('xdebug'), '3.1', '>=')) { | |
| if (!in_array('coverage', xdebug_info('mode'), true)) { | |
| throw new XdebugNotEnabledException; | |
| } | |
| return; | |
| } | |
| $mode = getenv('XDEBUG_MODE'); | |
| if ($mode === false || $mode === '') { | |
| $mode = ini_get('xdebug.mode'); | |
| } | |
| if ($mode === false || | |
| !in_array('coverage', explode(',', $mode), true)) { | |
| throw new XdebugNotEnabledException; | |
| } | |
| } | |
| } | |
Xet Storage Details
- Size:
- 4.67 kB
- Xet hash:
- 9558551267e1ed5ee15615b4cb59016e48b73ff93f5b57775296d0469c6989fb
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.