*/ private $filesByDirectory = []; /** * @var \PHPStan\BetterReflection\SourceLocator\Type\AggregateSourceLocator|null */ private $aggregateSourceLocator; /** * @readonly * @var \PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher */ private $fileNodesFetcher; /** * @readonly * @var \PHPStan\Php\PhpVersion */ private $phpVersion; public function __construct(FileNodesFetcher $fileNodesFetcher, PhpVersion $phpVersion) { $this->fileNodesFetcher = $fileNodesFetcher; $this->phpVersion = $phpVersion; } public function setFilePath(string $filePath) : void { $this->filePaths = [$filePath]; } /** * @param string[] $files */ public function addFiles(array $files) : void { $this->filePaths = \array_merge($this->filePaths, $files); } public function provide() : SourceLocator { // do not cache for PHPUnit, as in test every fixture is different $isPHPUnitRun = StaticPHPUnitEnvironment::isPHPUnitRun(); if ($this->aggregateSourceLocator instanceof AggregateSourceLocator && !$isPHPUnitRun) { return $this->aggregateSourceLocator; } $sourceLocators = []; foreach ($this->filePaths as $file) { $sourceLocators[] = new OptimizedSingleFileSourceLocator($this->fileNodesFetcher, $file); } foreach ($this->filesByDirectory as $files) { $sourceLocators[] = new OptimizedDirectorySourceLocator($this->fileNodesFetcher, $this->phpVersion, $files); } $this->aggregateSourceLocator = new AggregateSourceLocator($sourceLocators); return $this->aggregateSourceLocator; } /** * @param string[] $files */ public function addFilesByDirectory(string $directory, array $files) : void { Assert::allString($files); $this->filesByDirectory[$directory] = $files; } }