Skip to content

Commit 6962280

Browse files
committed
Fix static reflection issues with custom autoloaders
1 parent 50cbc45 commit 6962280

File tree

5 files changed

+69
-1
lines changed

5 files changed

+69
-1
lines changed

Diff for: composer.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@
8484
"src/"
8585
]
8686
},
87-
"files": ["src/dumpType.php","src/Testing/functions.php"]
87+
"files": ["src/dumpType.php", "src/autoloadFunctions.php", "src/Testing/functions.php"]
8888
},
8989
"autoload-dev": {
9090
"psr-4": {

Diff for: src/Command/CommandHelper.php

+20
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
use function is_string;
5252
use function mkdir;
5353
use function register_shutdown_function;
54+
use function spl_autoload_functions;
5455
use function sprintf;
5556
use function str_ends_with;
5657
use function str_repeat;
@@ -289,6 +290,8 @@ public static function begin(
289290
$createDir($tmpDir);
290291
}
291292

293+
$autoloadFunctionsBefore = spl_autoload_functions();
294+
292295
try {
293296
$container = $containerFactory->create($tmpDir, $additionalConfigFiles, $paths, $composerAutoloaderProjectPaths, $analysedPathsFromConfig, $level ?? self::DEFAULT_LEVEL, $generateBaselineFile, $autoloadFile, $singleReflectionFile, $singleReflectionInsteadOfFile);
294297
} catch (InvalidConfigurationException | AssertionException $e) {
@@ -371,6 +374,23 @@ public static function begin(
371374
foreach ($container->getParameter('bootstrapFiles') as $bootstrapFileFromArray) {
372375
self::executeBootstrapFile($bootstrapFileFromArray, $container, $errorOutput, $debugEnabled);
373376
}
377+
$autoloadFunctionsAfter = spl_autoload_functions();
378+
379+
$newAutoloadFunctions = [];
380+
if ($autoloadFunctionsBefore !== false && $autoloadFunctionsAfter !== false) {
381+
$newAutoloadFunctions = [];
382+
foreach ($autoloadFunctionsAfter as $after) {
383+
foreach ($autoloadFunctionsBefore as $before) {
384+
if ($after === $before) {
385+
continue 2;
386+
}
387+
}
388+
389+
$newAutoloadFunctions[] = $after;
390+
}
391+
392+
$GLOBALS['__phpstanAutoloadFunctions'] = $newAutoloadFunctions;
393+
}
374394

375395
if (PHP_VERSION_ID >= 80000) {
376396
require_once __DIR__ . '/../../stubs/runtime/Enum/UnitEnum.php';

Diff for: src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\BetterReflection\SourceLocator\Type\MemoizingSourceLocator;
1414
use PHPStan\BetterReflection\SourceLocator\Type\PhpInternalSourceLocator;
1515
use PHPStan\BetterReflection\SourceLocator\Type\SourceLocator;
16+
use PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadFunctionsSourceLocator;
1617
use PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadSourceLocator;
1718
use PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker;
1819
use PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorRepository;
@@ -65,6 +66,8 @@ public function create(): SourceLocator
6566
$locators[] = $this->optimizedSingleFileSourceLocatorRepository->getOrCreate($this->singleReflectionFile);
6667
}
6768

69+
$locators[] = new AutoloadFunctionsSourceLocator();
70+
6871
$analysedDirectories = [];
6972
$analysedFiles = [];
7073

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection\BetterReflection\SourceLocator;
4+
5+
use PHPStan\BetterReflection\Identifier\Identifier;
6+
use PHPStan\BetterReflection\Identifier\IdentifierType;
7+
use PHPStan\BetterReflection\Reflection\Reflection;
8+
use PHPStan\BetterReflection\Reflector\Reflector;
9+
use PHPStan\BetterReflection\SourceLocator\Type\SourceLocator;
10+
use function PHPStan\autoloadFunctions;
11+
12+
class AutoloadFunctionsSourceLocator implements SourceLocator
13+
{
14+
15+
public function locateIdentifier(Reflector $reflector, Identifier $identifier): ?Reflection
16+
{
17+
if (!$identifier->isClass()) {
18+
return null;
19+
}
20+
21+
$autoloadFunctions = autoloadFunctions();
22+
foreach ($autoloadFunctions as $autoloadFunction) {
23+
$autoloadFunction($identifier->getName());
24+
}
25+
26+
return null;
27+
}
28+
29+
public function locateIdentifiersByType(Reflector $reflector, IdentifierType $identifierType): array
30+
{
31+
return [];
32+
}
33+
34+
}

Diff for: src/autoloadFunctions.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan;
4+
5+
/**
6+
* @return array<int, callable(string): void>
7+
*/
8+
function autoloadFunctions(): array // phpcs:ignore Squiz.Functions.GlobalFunction.Found
9+
{
10+
return $GLOBALS['__phpstanAutoloadFunctions'] ?? [];
11+
}

0 commit comments

Comments
 (0)