Skip to content

Commit b116f7c

Browse files
phpstan-botstaabm
authored andcommitted
Report error when using enum case outside of enum
- Added new EnumCaseOutsideEnumRule that reports an error when `case` is used in classes or interfaces instead of enums - New regression test in tests/PHPStan/Rules/EnumCases/data/bug-14252.php - The rule is registered at level 0 and uses the identifier `enum.caseOutsideOfEnum` Closes phpstan/phpstan#14252
1 parent 66617b9 commit b116f7c

File tree

3 files changed

+97
-0
lines changed

3 files changed

+97
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\EnumCases;
4+
5+
use PhpParser\Node;
6+
use PHPStan\Analyser\Scope;
7+
use PHPStan\DependencyInjection\RegisteredRule;
8+
use PHPStan\Rules\Rule;
9+
use PHPStan\Rules\RuleErrorBuilder;
10+
11+
/**
12+
* @implements Rule<Node\Stmt\EnumCase>
13+
*/
14+
#[RegisteredRule(level: 0)]
15+
final class EnumCaseOutsideEnumRule implements Rule
16+
{
17+
18+
public function getNodeType(): string
19+
{
20+
return Node\Stmt\EnumCase::class;
21+
}
22+
23+
public function processNode(Node $node, Scope $scope): array
24+
{
25+
if (!$scope->isInClass()) {
26+
return [];
27+
}
28+
29+
$classReflection = $scope->getClassReflection();
30+
if ($classReflection->isEnum()) {
31+
return [];
32+
}
33+
34+
return [
35+
RuleErrorBuilder::message('Enum case can only be used in enums.')
36+
->nonIgnorable()
37+
->identifier('enum.caseOutsideOfEnum')
38+
->build(),
39+
];
40+
}
41+
42+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\EnumCases;
4+
5+
use PHPStan\Rules\Rule;
6+
use PHPStan\Testing\RuleTestCase;
7+
use PHPUnit\Framework\Attributes\RequiresPhp;
8+
9+
/**
10+
* @extends RuleTestCase<EnumCaseOutsideEnumRule>
11+
*/
12+
class EnumCaseOutsideEnumRuleTest extends RuleTestCase
13+
{
14+
15+
protected function getRule(): Rule
16+
{
17+
return new EnumCaseOutsideEnumRule();
18+
}
19+
20+
#[RequiresPhp('>= 8.1')]
21+
public function testRule(): void
22+
{
23+
$this->analyse([__DIR__ . '/data/bug-14252.php'], [
24+
[
25+
'Enum case can only be used in enums.',
26+
9,
27+
],
28+
[
29+
'Enum case can only be used in enums.',
30+
14,
31+
],
32+
]);
33+
}
34+
35+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php // lint >= 8.1
2+
3+
declare(strict_types = 1);
4+
5+
namespace Bug14252;
6+
7+
class Foo
8+
{
9+
case Active;
10+
}
11+
12+
interface Bar
13+
{
14+
case Active;
15+
}
16+
17+
enum Qux
18+
{
19+
case Active;
20+
}

0 commit comments

Comments
 (0)