Revision 150 | Blame | Vergleich mit vorheriger | Letzte Änderung | Log anzeigen | RSS feed
<?php declare(strict_types=1);/** This file is part of PHPUnit.** (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 PHPUnit\Util;use const DIRECTORY_SEPARATOR;use function class_exists;use function defined;use function dirname;use function is_dir;use function realpath;use function sprintf;use function strpos;use function sys_get_temp_dir;use Composer\Autoload\ClassLoader;use DeepCopy\DeepCopy;use Doctrine\Instantiator\Instantiator;use PharIo\Manifest\Manifest;use PharIo\Version\Version as PharIoVersion;use PhpParser\Parser;use PHPUnit\Framework\TestCase;use ReflectionClass;use SebastianBergmann\CliParser\Parser as CliParser;use SebastianBergmann\CodeCoverage\CodeCoverage;use SebastianBergmann\CodeUnit\CodeUnit;use SebastianBergmann\CodeUnitReverseLookup\Wizard;use SebastianBergmann\Comparator\Comparator;use SebastianBergmann\Complexity\Calculator;use SebastianBergmann\Diff\Diff;use SebastianBergmann\Environment\Runtime;use SebastianBergmann\Exporter\Exporter;use SebastianBergmann\FileIterator\Facade as FileIteratorFacade;use SebastianBergmann\GlobalState\Snapshot;use SebastianBergmann\Invoker\Invoker;use SebastianBergmann\LinesOfCode\Counter;use SebastianBergmann\ObjectEnumerator\Enumerator;use SebastianBergmann\RecursionContext\Context;use SebastianBergmann\ResourceOperations\ResourceOperations;use SebastianBergmann\Template\Template;use SebastianBergmann\Timer\Timer;use SebastianBergmann\Type\TypeName;use SebastianBergmann\Version;use TheSeer\Tokenizer\Tokenizer;/*** @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit*/final class ExcludeList{/*** @var array<string,int>*/private const EXCLUDED_CLASS_NAMES = [// composerClassLoader::class => 1,// doctrine/instantiatorInstantiator::class => 1,// myclabs/deepcopyDeepCopy::class => 1,// nikic/php-parserParser::class => 1,// phar-io/manifestManifest::class => 1,// phar-io/versionPharIoVersion::class => 1,// phpdocumentor/type-resolverType::class => 1,// phpunit/phpunitTestCase::class => 2,// phpunit/php-code-coverageCodeCoverage::class => 1,// phpunit/php-file-iteratorFileIteratorFacade::class => 1,// phpunit/php-invokerInvoker::class => 1,// phpunit/php-text-templateTemplate::class => 1,// phpunit/php-timerTimer::class => 1,// sebastian/cli-parserCliParser::class => 1,// sebastian/code-unitCodeUnit::class => 1,// sebastian/code-unit-reverse-lookupWizard::class => 1,// sebastian/comparatorComparator::class => 1,// sebastian/complexityCalculator::class => 1,// sebastian/diffDiff::class => 1,// sebastian/environmentRuntime::class => 1,// sebastian/exporterExporter::class => 1,// sebastian/global-stateSnapshot::class => 1,// sebastian/lines-of-codeCounter::class => 1,// sebastian/object-enumeratorEnumerator::class => 1,// sebastian/recursion-contextContext::class => 1,// sebastian/resource-operationsResourceOperations::class => 1,// sebastian/typeTypeName::class => 1,// sebastian/versionVersion::class => 1,// theseer/tokenizerTokenizer::class => 1,];/*** @var string[]*/private static $directories = [];/*** @var bool*/private static $initialized = false;public static function addDirectory(string $directory): void{if (!is_dir($directory)) {throw new Exception(sprintf('"%s" is not a directory',$directory));}self::$directories[] = realpath($directory);}/*** @throws Exception** @return string[]*/public function getExcludedDirectories(): array{$this->initialize();return self::$directories;}/*** @throws Exception*/public function isExcluded(string $file): bool{if (defined('PHPUNIT_TESTSUITE')) {return false;}$this->initialize();foreach (self::$directories as $directory) {if (strpos($file, $directory) === 0) {return true;}}return false;}/*** @throws Exception*/private function initialize(): void{if (self::$initialized) {return;}foreach (self::EXCLUDED_CLASS_NAMES as $className => $parent) {if (!class_exists($className)) {continue;}$directory = (new ReflectionClass($className))->getFileName();for ($i = 0; $i < $parent; $i++) {$directory = dirname($directory);}self::$directories[] = $directory;}// Hide process isolation workaround on Windows.if (DIRECTORY_SEPARATOR === '\\') {// tempnam() prefix is limited to first 3 chars.// @see https://php.net/manual/en/function.tempnam.phpself::$directories[] = sys_get_temp_dir() . '\\PHP';}self::$initialized = true;}}