Skip to content

Commit 2e61259

Browse files
committed
Attempt to load remaining classes after skipping them in ClassBlacklistSourceLocator if they're not in Composer paths
1 parent 3902d73 commit 2e61259

3 files changed

Lines changed: 55 additions & 3 deletions

File tree

build/phpstan.neon

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@ parameters:
3636
stubFiles:
3737
- stubs/ReactChildProcess.php
3838
- stubs/ReactStreams.php
39-
staticReflectionClassNamePatterns!:
40-
- '#^PhpParser\\#'
41-
- '#^Hoa\\#'
4239
services:
4340
-
4441
class: PHPStan\Build\ServiceLocatorDynamicReturnTypeExtension

src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PHPStan\DependencyInjection\Container;
66
use PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadSourceLocator;
77
use PHPStan\Reflection\BetterReflection\SourceLocator\ClassBlacklistSourceLocator;
8+
use PHPStan\Reflection\BetterReflection\SourceLocator\ClassWhitelistSourceLocator;
89
use PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker;
910
use PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorRepository;
1011
use PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedSingleFileSourceLocatorRepository;
@@ -170,6 +171,7 @@ public function create(): SourceLocator
170171
}
171172
$locators[] = $locator;
172173
}
174+
$locators[] = new ClassWhitelistSourceLocator($this->autoloadSourceLocator, $this->staticReflectionClassNamePatterns);
173175
$locators[] = new PhpInternalSourceLocator($astLocator, $this->reflectionSourceStubber);
174176
$locators[] = new EvaledCodeSourceLocator($astLocator, $this->reflectionSourceStubber);
175177

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection\BetterReflection\SourceLocator;
4+
5+
use Nette\Utils\Strings;
6+
use Roave\BetterReflection\Identifier\Identifier;
7+
use Roave\BetterReflection\Identifier\IdentifierType;
8+
use Roave\BetterReflection\Reflection\Reflection;
9+
use Roave\BetterReflection\Reflector\Reflector;
10+
use Roave\BetterReflection\SourceLocator\Type\SourceLocator;
11+
12+
class ClassWhitelistSourceLocator implements SourceLocator
13+
{
14+
15+
private SourceLocator $sourceLocator;
16+
17+
/** @var string[] */
18+
private array $patterns;
19+
20+
/**
21+
* @param SourceLocator $sourceLocator
22+
* @param string[] $patterns
23+
*/
24+
public function __construct(
25+
SourceLocator $sourceLocator,
26+
array $patterns
27+
)
28+
{
29+
$this->sourceLocator = $sourceLocator;
30+
$this->patterns = $patterns;
31+
}
32+
33+
public function locateIdentifier(Reflector $reflector, Identifier $identifier): ?Reflection
34+
{
35+
if ($identifier->isClass()) {
36+
foreach ($this->patterns as $pattern) {
37+
if (Strings::match($identifier->getName(), $pattern) !== null) {
38+
return $this->sourceLocator->locateIdentifier($reflector, $identifier);
39+
}
40+
}
41+
42+
return null;
43+
}
44+
45+
return $this->sourceLocator->locateIdentifier($reflector, $identifier);
46+
}
47+
48+
public function locateIdentifiersByType(Reflector $reflector, IdentifierType $identifierType): array
49+
{
50+
return $this->sourceLocator->locateIdentifiersByType($reflector, $identifierType);
51+
}
52+
53+
}

0 commit comments

Comments
 (0)