Skip to content

Commit d764925

Browse files
committed
Test anonymous class reflection names
1 parent ab3d1bd commit d764925

File tree

2 files changed

+118
-0
lines changed

2 files changed

+118
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection;
4+
5+
use PhpParser\Node;
6+
use PhpParser\Node\Stmt\Class_;
7+
use PHPStan\Analyser\Scope;
8+
use PHPStan\Parser\AnonymousClassVisitor;
9+
use PHPStan\Rules\Rule;
10+
use PHPStan\Rules\RuleErrorBuilder;
11+
use PHPStan\Testing\RuleTestCase;
12+
use function implode;
13+
use function sprintf;
14+
15+
/**
16+
* @extends RuleTestCase<Rule<Class_>>
17+
*/
18+
class AnonymousClassReflectionTest extends RuleTestCase
19+
{
20+
21+
/**
22+
* @return Rule<Class_>
23+
*/
24+
protected function getRule(): Rule
25+
{
26+
return new /** @implements Rule<Class_> */ class (self::createReflectionProvider()) implements Rule {
27+
28+
public function __construct(private ReflectionProvider $reflectionProvider)
29+
{
30+
}
31+
32+
public function getNodeType(): string
33+
{
34+
return Class_::class;
35+
}
36+
37+
public function processNode(Node $node, Scope $scope): array
38+
{
39+
if (!(bool) $node->getAttribute(AnonymousClassVisitor::ATTRIBUTE_ANONYMOUS_CLASS)) {
40+
return [];
41+
}
42+
43+
$classReflection = $this->reflectionProvider->getAnonymousClassReflection($node, $scope);
44+
45+
return [
46+
RuleErrorBuilder::message(sprintf(
47+
"name: %s\ndisplay name: %s",
48+
$classReflection->getName(),
49+
$classReflection->getDisplayName(),
50+
))->identifier('test.anonymousClassReflection')->build(),
51+
];
52+
}
53+
54+
};
55+
}
56+
57+
public function testReflection(): void
58+
{
59+
$this->analyse([__DIR__ . '/data/anonymous-classes.php'], [
60+
[
61+
implode("\n", [
62+
'name: AnonymousClass0c307d7b8501323d1d30b0afea7e0578',
63+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:5',
64+
]),
65+
5,
66+
],
67+
[
68+
implode("\n", [
69+
'name: AnonymousClassa16017c480192f8fbf3c03e17840e99c',
70+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:7:1',
71+
]),
72+
7,
73+
],
74+
[
75+
implode("\n", [
76+
'name: AnonymousClassd68d75f1cdac379350e3027c09a7c5a0',
77+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:7:2',
78+
]),
79+
7,
80+
],
81+
[
82+
implode("\n", [
83+
'name: AnonymousClass75aa798fed4f30306c14dcf03a50878c',
84+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:7:3',
85+
]),
86+
7,
87+
],
88+
[
89+
implode("\n", [
90+
'name: AnonymousClass4fcabdc52bfed5f8c101f3f89b2180bd',
91+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:9:1',
92+
]),
93+
9,
94+
],
95+
[
96+
implode("\n", [
97+
'name: AnonymousClass0e77d7995f4c47dcd5402817970fd7e0',
98+
'display name: class@anonymous/tests/PHPStan/Reflection/data/anonymous-classes.php:9:2',
99+
]),
100+
9,
101+
],
102+
]);
103+
}
104+
105+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace AnonymousClassReflectionTest;
4+
5+
new class {};
6+
7+
new class {}; new class {}; new class {};
8+
9+
new class (new class {}) {
10+
public function __construct(object $object)
11+
{
12+
}
13+
};

0 commit comments

Comments
 (0)