Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. XdebugDriver.php

class XdebugDriver

@internal This class is not covered by the backward compatibility promise for phpunit/php-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>

Hierarchy

  • class \SebastianBergmann\CodeCoverage\Driver\Driver
    • class \SebastianBergmann\CodeCoverage\Driver\XdebugDriver extends \SebastianBergmann\CodeCoverage\Driver\Driver

Expanded class hierarchy of XdebugDriver

See also

https://xdebug.org/docs/code_coverage#xdebug_get_code_coverage

File

vendor/phpunit/php-code-coverage/src/Driver/XdebugDriver.php, line 63

Namespace

SebastianBergmann\CodeCoverage\Driver
View source
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();
        }
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
Driver::$collectBranchAndPathCoverage private property
Driver::$detectDeadCode private property
Driver::BRANCH_HIT public constant
Driver::BRANCH_NOT_HIT public constant
Driver::collectsBranchAndPathCoverage public function
Driver::detectsDeadCode public function
Driver::disableBranchAndPathCoverage public function
Driver::disableDeadCodeDetection public function
Driver::enableBranchAndPathCoverage public function
Driver::enableDeadCodeDetection public function
Driver::LINE_EXECUTED public constant
Driver::LINE_NOT_EXECUTABLE public constant
Driver::LINE_NOT_EXECUTED public constant
XdebugDriver::canCollectBranchAndPathCoverage public function Overrides Driver::canCollectBranchAndPathCoverage
XdebugDriver::canDetectDeadCode public function Overrides Driver::canDetectDeadCode
XdebugDriver::ensureXdebugCodeCoverageFeatureIsEnabled private function
XdebugDriver::ensureXdebugIsAvailable private function
XdebugDriver::nameAndVersion public function Overrides Driver::nameAndVersion
XdebugDriver::start public function Overrides Driver::start
XdebugDriver::stop public function Overrides Driver::stop
XdebugDriver::__construct public function

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal