You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.4 KiB
128 lines
3.4 KiB
<?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'); |
|
} |
|
}
|
|
|