Repository navigation
Expand file tree
/
Copy pathPhpDocPrivateClassConstFetchFinderVisitor.php
More file actions
68 lines (56 loc) · 1.78 KB
/
Copy pathPhpDocPrivateClassConstFetchFinderVisitor.php
File metadata and controls
68 lines (56 loc) · 1.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php declare(strict_types = 1);
namespace PHPStan\PhpDoc;
use Nette\Utils\Strings;
use Override;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PHPStan\Analyser\Scope;
use PHPStan\Node\Constant\ClassConstantFetch;
use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor;
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
use PHPStan\Reflection\ClassReflection;
use function preg_quote;
use function str_replace;
final class PhpDocPrivateClassConstFetchFinderVisitor extends AbstractNodeVisitor
{
/** @var list<ClassConstantFetch> */
public array $classConstantFetches = [];
public function __construct(private ClassReflection $classReflection, private Scope $scope)
{
}
#[Override]
public function enterNode(\PHPStan\PhpDocParser\Ast\Node $node)
{
if (!$node instanceof ConstFetchNode) {
return null;
}
if ($node->className !== 'self') {
return null;
}
$constantName = $node->name;
if (Strings::contains($constantName, '*')) {
// convert * into .*? and escape everything else so the constants can be matched against the pattern
$pattern = '{^' . str_replace('\\*', '.*?', preg_quote($constantName)) . '$}D';
foreach ($this->classReflection->getNativeReflection()->getReflectionConstants() as $reflectionConstant) {
$classConstantName = $reflectionConstant->getName();
if (Strings::match($classConstantName, $pattern) === null) {
continue;
}
$this->addClassConstantFetch($classConstantName);
}
} else {
$this->addClassConstantFetch($constantName);
}
return null;
}
private function addClassConstantFetch(string $constantName): void
{
$this->classConstantFetches[] = new ClassConstantFetch(
new Expr\ClassConstFetch(
new Node\Name\FullyQualified($this->classReflection->getName()),
$constantName,
),
$this->scope,
);
}
}