Skip to content

Commit 7d8c29d

Browse files
kukulichondrejmirtes
authored andcommitted
DuplicateDeclarationRule checks duplicate enum cases as well
1 parent 9b7c824 commit 7d8c29d

File tree

4 files changed

+43
-0
lines changed

4 files changed

+43
-0
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ lint:
2828
--exclude tests/PHPStan/Rules/Operators/data/invalid-inc-dec.php \
2929
--exclude tests/PHPStan/Rules/Arrays/data/offset-access-without-dim-for-reading.php \
3030
--exclude tests/PHPStan/Rules/Classes/data/duplicate-declarations.php \
31+
--exclude tests/PHPStan/Rules/Classes/data/duplicate-enum-cases.php \
3132
--exclude tests/PHPStan/Rules/Classes/data/extends-error.php \
3233
--exclude tests/PHPStan/Rules/Classes/data/implements-error.php \
3334
--exclude tests/PHPStan/Rules/Classes/data/interface-extends-error.php \

src/Rules/Classes/DuplicateDeclarationRule.php

Lines changed: 18 additions & 0 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\EnumCase;
67
use PHPStan\Analyser\Scope;
78
use PHPStan\Node\InClassNode;
89
use PHPStan\Rules\RuleErrorBuilder;
@@ -45,6 +46,23 @@ public function processNode(Node $node, Scope $scope): array
4546
}
4647
}
4748

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;
63+
}
64+
}
65+
4866
$declaredProperties = [];
4967
foreach ($node->getOriginalNode()->getProperties() as $propertyDecl) {
5068
foreach ($propertyDecl->props as $property) {

tests/PHPStan/Rules/Classes/DuplicateDeclarationRuleTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,18 @@ public function testDuplicatePromotedProperty(): void
7373
]);
7474
}
7575

76+
public function testDuplicateEnumCase(): void
77+
{
78+
if (!self::$useStaticReflectionProvider) {
79+
$this->markTestSkipped('This test needs static reflection');
80+
}
81+
82+
$this->analyse([__DIR__ . '/data/duplicate-enum-cases.php'], [
83+
[
84+
'Cannot redeclare enum case DuplicatedEnumCase\Foo::BAR.',
85+
9,
86+
],
87+
]);
88+
}
89+
7690
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php // lint >= 8.1
2+
3+
namespace DuplicatedEnumCase;
4+
5+
enum Foo
6+
{
7+
case BAR;
8+
case FOO;
9+
case BAR;
10+
}

0 commit comments

Comments
 (0)