Skip to content

Commit e4b6ffd

Browse files
committed
ComposerJsonAndInstalledJsonSourceLocatorMaker - optimized memory consumption for many autoloaded files
1 parent 3ccc152 commit e4b6ffd

6 files changed

Lines changed: 58 additions & 23 deletions

File tree

conf/config.neon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,7 @@ services:
591591
class: PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker
592592

593593
-
594-
implement: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory
594+
class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory
595595
arguments:
596596
fileFinder: @fileFinderScan
597597

src/Reflection/BetterReflection/SourceLocator/ComposerJsonAndInstalledJsonSourceLocatorMaker.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ class ComposerJsonAndInstalledJsonSourceLocatorMaker
1414

1515
private \PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorRepository $optimizedDirectorySourceLocatorRepository;
1616

17-
private \PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedSingleFileSourceLocatorRepository $optimizedSingleFileSourceLocatorRepository;
18-
1917
private \PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedPsrAutoloaderLocatorFactory $optimizedPsrAutoloaderLocatorFactory;
2018

19+
private OptimizedDirectorySourceLocatorFactory $optimizedDirectorySourceLocatorFactory;
20+
2121
public function __construct(
2222
OptimizedDirectorySourceLocatorRepository $optimizedDirectorySourceLocatorRepository,
23-
OptimizedSingleFileSourceLocatorRepository $optimizedSingleFileSourceLocatorRepository,
24-
OptimizedPsrAutoloaderLocatorFactory $optimizedPsrAutoloaderLocatorFactory
23+
OptimizedPsrAutoloaderLocatorFactory $optimizedPsrAutoloaderLocatorFactory,
24+
OptimizedDirectorySourceLocatorFactory $optimizedDirectorySourceLocatorFactory
2525
)
2626
{
2727
$this->optimizedDirectorySourceLocatorRepository = $optimizedDirectorySourceLocatorRepository;
28-
$this->optimizedSingleFileSourceLocatorRepository = $optimizedSingleFileSourceLocatorRepository;
2928
$this->optimizedPsrAutoloaderLocatorFactory = $optimizedPsrAutoloaderLocatorFactory;
29+
$this->optimizedDirectorySourceLocatorFactory = $optimizedDirectorySourceLocatorFactory;
3030
}
3131

3232
public function create(string $projectInstallationPath): ?SourceLocator
@@ -115,11 +115,17 @@ public function create(string $projectInstallationPath): ?SourceLocator
115115
$locators[] = $this->optimizedDirectorySourceLocatorRepository->getOrCreate($classMapDirectory);
116116
}
117117

118+
$files = [];
119+
118120
foreach (array_merge($classMapFiles, $filePaths) as $file) {
119121
if (!is_file($file)) {
120122
continue;
121123
}
122-
$locators[] = $this->optimizedSingleFileSourceLocatorRepository->getOrCreate($file);
124+
$files[] = $file;
125+
}
126+
127+
if (count($files) > 0) {
128+
$locators[] = $this->optimizedDirectorySourceLocatorFactory->createByFiles($files);
123129
}
124130

125131
return new AggregateSourceLocator($locators);

src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace PHPStan\Reflection\BetterReflection\SourceLocator;
44

5-
use PHPStan\File\FileFinder;
65
use Roave\BetterReflection\Identifier\Identifier;
76
use Roave\BetterReflection\Identifier\IdentifierType;
87
use Roave\BetterReflection\Reflection\Reflection;
@@ -16,9 +15,8 @@ class OptimizedDirectorySourceLocator implements SourceLocator
1615

1716
private \PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher $fileNodesFetcher;
1817

19-
private \PHPStan\File\FileFinder $fileFinder;
20-
21-
private string $directory;
18+
/** @var string[] */
19+
private array $files;
2220

2321
/** @var array<string, string>|null */
2422
private ?array $classToFile = null;
@@ -35,15 +33,17 @@ class OptimizedDirectorySourceLocator implements SourceLocator
3533
/** @var array<string, \Roave\BetterReflection\SourceLocator\Located\LocatedSource> */
3634
private array $locatedSourcesByFile = [];
3735

36+
/**
37+
* @param FileNodesFetcher $fileNodesFetcher
38+
* @param string[] $files
39+
*/
3840
public function __construct(
3941
FileNodesFetcher $fileNodesFetcher,
40-
FileFinder $fileFinder,
41-
string $directory
42+
array $files
4243
)
4344
{
4445
$this->fileNodesFetcher = $fileNodesFetcher;
45-
$this->fileFinder = $fileFinder;
46-
$this->directory = $directory;
46+
$this->files = $files;
4747
}
4848

4949
public function locateIdentifier(Reflector $reflector, Identifier $identifier): ?Reflection
@@ -162,10 +162,9 @@ private function findFilesByFunction(string $functionName): array
162162

163163
private function init(): void
164164
{
165-
$fileFinderResult = $this->fileFinder->findFiles([$this->directory]);
166165
$classToFile = [];
167166
$functionToFiles = [];
168-
foreach ($fileFinderResult->getFiles() as $file) {
167+
foreach ($this->files as $file) {
169168
$symbols = $this->findSymbols($file);
170169
$classesInFile = $symbols['classes'];
171170
$functionsInFile = $symbols['functions'];

src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorFactory.php

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,39 @@
22

33
namespace PHPStan\Reflection\BetterReflection\SourceLocator;
44

5-
interface OptimizedDirectorySourceLocatorFactory
5+
use PHPStan\File\FileFinder;
6+
7+
class OptimizedDirectorySourceLocatorFactory
68
{
79

8-
public function create(string $directory): OptimizedDirectorySourceLocator;
10+
private FileNodesFetcher $fileNodesFetcher;
11+
12+
private FileFinder $fileFinder;
13+
14+
public function __construct(FileNodesFetcher $fileNodesFetcher, FileFinder $fileFinder)
15+
{
16+
$this->fileNodesFetcher = $fileNodesFetcher;
17+
$this->fileFinder = $fileFinder;
18+
}
19+
20+
public function createByDirectory(string $directory): OptimizedDirectorySourceLocator
21+
{
22+
return new OptimizedDirectorySourceLocator(
23+
$this->fileNodesFetcher,
24+
$this->fileFinder->findFiles([$directory])->getFiles()
25+
);
26+
}
27+
28+
/**
29+
* @param string[] $files
30+
* @return OptimizedDirectorySourceLocator
31+
*/
32+
public function createByFiles(array $files): OptimizedDirectorySourceLocator
33+
{
34+
return new OptimizedDirectorySourceLocator(
35+
$this->fileNodesFetcher,
36+
$files
37+
);
38+
}
939

1040
}

src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorRepository.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function getOrCreate(string $directory): OptimizedDirectorySourceLocator
2121
return $this->locators[$directory];
2222
}
2323

24-
$this->locators[$directory] = $this->factory->create($directory);
24+
$this->locators[$directory] = $this->factory->createByDirectory($directory);
2525

2626
return $this->locators[$directory];
2727
}

tests/PHPStan/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public function dataClass(): array
4545
public function testClass(string $className, string $expectedClassName, string $file): void
4646
{
4747
$factory = self::getContainer()->getByType(OptimizedDirectorySourceLocatorFactory::class);
48-
$locator = $factory->create(__DIR__ . '/data/directory');
48+
$locator = $factory->createByDirectory(__DIR__ . '/data/directory');
4949
$classReflector = new ClassReflector($locator);
5050
$classReflection = $classReflector->reflect($className);
5151
$this->assertSame($expectedClassName, $classReflection->getName());
@@ -93,7 +93,7 @@ public function dataFunctionExists(): array
9393
public function testFunctionExists(string $functionName, string $expectedFunctionName, string $file): void
9494
{
9595
$factory = self::getContainer()->getByType(OptimizedDirectorySourceLocatorFactory::class);
96-
$locator = $factory->create(__DIR__ . '/data/directory');
96+
$locator = $factory->createByDirectory(__DIR__ . '/data/directory');
9797
$classReflector = new ClassReflector($locator);
9898
$functionReflector = new FunctionReflector($locator, $classReflector);
9999
$functionReflection = $functionReflector->reflect($functionName);
@@ -117,7 +117,7 @@ public function dataFunctionDoesNotExist(): array
117117
public function testFunctionDoesNotExist(string $functionName): void
118118
{
119119
$factory = self::getContainer()->getByType(OptimizedDirectorySourceLocatorFactory::class);
120-
$locator = $factory->create(__DIR__ . '/data/directory');
120+
$locator = $factory->createByDirectory(__DIR__ . '/data/directory');
121121
$classReflector = new ClassReflector($locator);
122122
$functionReflector = new FunctionReflector($locator, $classReflector);
123123

0 commit comments

Comments
 (0)