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

Breadcrumb

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

function ParsingFileAnalyser::analyse

Throws

ParserException

6 calls to ParsingFileAnalyser::analyse()
ParsingFileAnalyser::classesIn in vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php
@psalm-return array<string, CodeUnitClassType>
ParsingFileAnalyser::executableLinesIn in vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php
@psalm-return LinesType
ParsingFileAnalyser::functionsIn in vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php
@psalm-return array<string, CodeUnitFunctionType>
ParsingFileAnalyser::ignoredLinesFor in vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php
@psalm-return LinesType
ParsingFileAnalyser::linesOfCodeFor in vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php
@psalm-return LinesOfCodeType

... See full list

File

vendor/phpunit/php-code-coverage/src/StaticAnalysis/ParsingFileAnalyser.php, line 127

Class

ParsingFileAnalyser
@internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage

Namespace

SebastianBergmann\CodeCoverage\StaticAnalysis

Code

private function analyse(string $filename) : void {
    if (isset($this->classes[$filename])) {
        return;
    }
    $source = file_get_contents($filename);
    $linesOfCode = max(substr_count($source, "\n") + 1, substr_count($source, "\r") + 1);
    if ($linesOfCode === 0 && !empty($source)) {
        $linesOfCode = 1;
    }
    assert($linesOfCode > 0);
    $parser = (new ParserFactory())->createForHostVersion();
    try {
        $nodes = $parser->parse($source);
        assert($nodes !== null);
        $traverser = new NodeTraverser();
        $codeUnitFindingVisitor = new CodeUnitFindingVisitor();
        $lineCountingVisitor = new LineCountingVisitor($linesOfCode);
        $ignoredLinesFindingVisitor = new IgnoredLinesFindingVisitor($this->useAnnotationsForIgnoringCode, $this->ignoreDeprecatedCode);
        $executableLinesFindingVisitor = new ExecutableLinesFindingVisitor($source);
        $traverser->addVisitor(new NameResolver());
        $traverser->addVisitor(new ParentConnectingVisitor());
        $traverser->addVisitor($codeUnitFindingVisitor);
        $traverser->addVisitor($lineCountingVisitor);
        $traverser->addVisitor($ignoredLinesFindingVisitor);
        $traverser->addVisitor($executableLinesFindingVisitor);
        
        /* @noinspection UnusedFunctionResultInspection */
        $traverser->traverse($nodes);
        // @codeCoverageIgnoreStart
    } catch (Error $error) {
        throw new ParserException(sprintf('Cannot parse %s: %s', $filename, $error->getMessage()), $error->getCode(), $error);
    }
    // @codeCoverageIgnoreEnd
    $this->classes[$filename] = $codeUnitFindingVisitor->classes();
    $this->traits[$filename] = $codeUnitFindingVisitor->traits();
    $this->functions[$filename] = $codeUnitFindingVisitor->functions();
    $this->executableLines[$filename] = $executableLinesFindingVisitor->executableLinesGroupedByBranch();
    $this->ignoredLines[$filename] = [];
    $this->findLinesIgnoredByLineBasedAnnotations($filename, $source, $this->useAnnotationsForIgnoringCode);
    $this->ignoredLines[$filename] = array_unique(array_merge($this->ignoredLines[$filename], $ignoredLinesFindingVisitor->ignoredLines()));
    sort($this->ignoredLines[$filename]);
    $result = $lineCountingVisitor->result();
    $this->linesOfCode[$filename] = [
        'linesOfCode' => $result->linesOfCode(),
        'commentLinesOfCode' => $result->commentLinesOfCode(),
        'nonCommentLinesOfCode' => $result->nonCommentLinesOfCode(),
    ];
}
RSS feed
Powered by Drupal