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

Breadcrumb

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

class CachingFileAnalyser

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

@psalm-import-type LinesOfCodeType from \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser

Hierarchy

  • class \SebastianBergmann\CodeCoverage\StaticAnalysis\CachingFileAnalyser implements \SebastianBergmann\CodeCoverage\StaticAnalysis\FileAnalyser

Expanded class hierarchy of CachingFileAnalyser

1 file declares its use of CachingFileAnalyser
CodeCoverage.php in vendor/phpunit/php-code-coverage/src/CodeCoverage.php

File

vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php, line 27

Namespace

SebastianBergmann\CodeCoverage\StaticAnalysis
View source
final class CachingFileAnalyser implements FileAnalyser {
    private static ?string $cacheVersion = null;
    private readonly string $directory;
    private readonly FileAnalyser $analyser;
    private readonly bool $useAnnotationsForIgnoringCode;
    private readonly bool $ignoreDeprecatedCode;
    private array $cache = [];
    public function __construct(string $directory, FileAnalyser $analyser, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) {
        Filesystem::createDirectory($directory);
        $this->analyser = $analyser;
        $this->directory = $directory;
        $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode;
        $this->ignoreDeprecatedCode = $ignoreDeprecatedCode;
    }
    public function classesIn(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['classesIn'];
    }
    public function traitsIn(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['traitsIn'];
    }
    public function functionsIn(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['functionsIn'];
    }
    
    /**
     * @psalm-return LinesOfCodeType
     */
    public function linesOfCodeFor(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['linesOfCodeFor'];
    }
    public function executableLinesIn(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['executableLinesIn'];
    }
    public function ignoredLinesFor(string $filename) : array {
        if (!isset($this->cache[$filename])) {
            $this->process($filename);
        }
        return $this->cache[$filename]['ignoredLinesFor'];
    }
    public function process(string $filename) : void {
        $cache = $this->read($filename);
        if ($cache !== false) {
            $this->cache[$filename] = $cache;
            return;
        }
        $this->cache[$filename] = [
            'classesIn' => $this->analyser
                ->classesIn($filename),
            'traitsIn' => $this->analyser
                ->traitsIn($filename),
            'functionsIn' => $this->analyser
                ->functionsIn($filename),
            'linesOfCodeFor' => $this->analyser
                ->linesOfCodeFor($filename),
            'ignoredLinesFor' => $this->analyser
                ->ignoredLinesFor($filename),
            'executableLinesIn' => $this->analyser
                ->executableLinesIn($filename),
        ];
        $this->write($filename, $this->cache[$filename]);
    }
    private function read(string $filename) : array|false {
        $cacheFile = $this->cacheFile($filename);
        if (!is_file($cacheFile)) {
            return false;
        }
        return unserialize(file_get_contents($cacheFile), [
            'allowed_classes' => false,
        ]);
    }
    private function write(string $filename, array $data) : void {
        file_put_contents($this->cacheFile($filename), serialize($data));
    }
    private function cacheFile(string $filename) : string {
        $cacheKey = md5(implode("\x00", [
            $filename,
            file_get_contents($filename),
            self::cacheVersion(),
            $this->useAnnotationsForIgnoringCode,
            $this->ignoreDeprecatedCode,
        ]));
        return $this->directory . DIRECTORY_SEPARATOR . $cacheKey;
    }
    private static function cacheVersion() : string {
        if (self::$cacheVersion !== null) {
            return self::$cacheVersion;
        }
        $buffer = [];
        foreach ((new FileIteratorFacade())->getFilesAsArray(__DIR__, '.php') as $file) {
            $buffer[] = $file;
            $buffer[] = file_get_contents($file);
        }
        self::$cacheVersion = md5(implode("\x00", $buffer));
        return self::$cacheVersion;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
CachingFileAnalyser::$analyser private property
CachingFileAnalyser::$cache private property
CachingFileAnalyser::$cacheVersion private static property
CachingFileAnalyser::$directory private property
CachingFileAnalyser::$ignoreDeprecatedCode private property
CachingFileAnalyser::$useAnnotationsForIgnoringCode private property
CachingFileAnalyser::cacheFile private function
CachingFileAnalyser::cacheVersion private static function
CachingFileAnalyser::classesIn public function @psalm-return array<string, CodeUnitClassType> Overrides FileAnalyser::classesIn
CachingFileAnalyser::executableLinesIn public function @psalm-return LinesType Overrides FileAnalyser::executableLinesIn
CachingFileAnalyser::functionsIn public function @psalm-return array<string, CodeUnitFunctionType> Overrides FileAnalyser::functionsIn
CachingFileAnalyser::ignoredLinesFor public function @psalm-return LinesType Overrides FileAnalyser::ignoredLinesFor
CachingFileAnalyser::linesOfCodeFor public function @psalm-return LinesOfCodeType Overrides FileAnalyser::linesOfCodeFor
CachingFileAnalyser::process public function
CachingFileAnalyser::read private function
CachingFileAnalyser::traitsIn public function @psalm-return array<string, CodeUnitTraitType> Overrides FileAnalyser::traitsIn
CachingFileAnalyser::write private function
CachingFileAnalyser::__construct public function

API Navigation

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