Skip to content

Commit be98a32

Browse files
kukulichondrejmirtes
authored andcommitted
DuplicateDeclarationRule - it's not possible to declare enum case when constant with same name already exists - and vice versa
1 parent 7d8c29d commit be98a32

File tree

3 files changed

+44
-26
lines changed

3 files changed

+44
-26
lines changed

src/Rules/Classes/DuplicateDeclarationRule.php

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPStan\Rules\Classes;
44

55
use PhpParser\Node;
6+
use PhpParser\Node\Stmt\ClassConst;
67
use PhpParser\Node\Stmt\EnumCase;
78
use PHPStan\Analyser\Scope;
89
use PHPStan\Node\InClassNode;
@@ -31,35 +32,30 @@ public function processNode(Node $node, Scope $scope): array
3132

3233
$errors = [];
3334

34-
$declaredClassConstants = [];
35-
foreach ($node->getOriginalNode()->getConstants() as $constDecl) {
36-
foreach ($constDecl->consts as $const) {
37-
if (array_key_exists($const->name->name, $declaredClassConstants)) {
35+
$declaredClassConstantsOrEnumCases = [];
36+
foreach ($node->getOriginalNode()->stmts as $stmtNode) {
37+
if ($stmtNode instanceof EnumCase) {
38+
if (array_key_exists($stmtNode->name->name, $declaredClassConstantsOrEnumCases)) {
3839
$errors[] = RuleErrorBuilder::message(sprintf(
39-
'Cannot redeclare constant %s::%s.',
40+
'Cannot redeclare enum case %s::%s.',
4041
$classReflection->getDisplayName(),
41-
$const->name->name
42-
))->line($const->getLine())->nonIgnorable()->build();
42+
$stmtNode->name->name
43+
))->line($stmtNode->getLine())->nonIgnorable()->build();
4344
} else {
44-
$declaredClassConstants[$const->name->name] = true;
45+
$declaredClassConstantsOrEnumCases[$stmtNode->name->name] = true;
46+
}
47+
} elseif ($stmtNode instanceof ClassConst) {
48+
foreach ($stmtNode->consts as $classConstNode) {
49+
if (array_key_exists($classConstNode->name->name, $declaredClassConstantsOrEnumCases)) {
50+
$errors[] = RuleErrorBuilder::message(sprintf(
51+
'Cannot redeclare constant %s::%s.',
52+
$classReflection->getDisplayName(),
53+
$classConstNode->name->name
54+
))->line($classConstNode->getLine())->nonIgnorable()->build();
55+
} else {
56+
$declaredClassConstantsOrEnumCases[$classConstNode->name->name] = true;
57+
}
4558
}
46-
}
47-
}
48-
49-
$declaredEnumCases = [];
50-
foreach ($node->getOriginalNode()->stmts as $stmtNode) {
51-
if (!$stmtNode instanceof EnumCase) {
52-
continue;
53-
}
54-
55-
if (array_key_exists($stmtNode->name->name, $declaredEnumCases)) {
56-
$errors[] = RuleErrorBuilder::message(sprintf(
57-
'Cannot redeclare enum case %s::%s.',
58-
$classReflection->getDisplayName(),
59-
$stmtNode->name->name
60-
))->line($stmtNode->getLine())->nonIgnorable()->build();
61-
} else {
62-
$declaredEnumCases[$stmtNode->name->name] = true;
6359
}
6460
}
6561

tests/PHPStan/Rules/Classes/DuplicateDeclarationRuleTest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,15 @@ public function testDuplicateEnumCase(): void
8282
$this->analyse([__DIR__ . '/data/duplicate-enum-cases.php'], [
8383
[
8484
'Cannot redeclare enum case DuplicatedEnumCase\Foo::BAR.',
85-
9,
85+
10,
86+
],
87+
[
88+
'Cannot redeclare enum case DuplicatedEnumCase\Boo::BAR.',
89+
17,
90+
],
91+
[
92+
'Cannot redeclare constant DuplicatedEnumCase\Hoo::BAR.',
93+
23,
8694
],
8795
]);
8896
}

tests/PHPStan/Rules/Classes/data/duplicate-enum-cases.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,19 @@ enum Foo
66
{
77
case BAR;
88
case FOO;
9+
case bar;
910
case BAR;
1011
}
12+
13+
enum Boo
14+
{
15+
const BAR = 0;
16+
const bar = 0;
17+
case BAR;
18+
}
19+
20+
enum Hoo
21+
{
22+
case BAR;
23+
const BAR = 0;
24+
}

0 commit comments

Comments
 (0)