File tree Expand file tree Collapse file tree 4 files changed +107
-0
lines changed
tests/PHPStan/Rules/EnumCases Expand file tree Collapse file tree 4 files changed +107
-0
lines changed Original file line number Diff line number Diff line change @@ -131,6 +131,7 @@ lint:
131131 --exclude tests/PHPStan/Rules/Classes/data/bug-14250.php \
132132 --exclude tests/PHPStan/Rules/Classes/data/bug-14250-promoted-properties.php \
133133 --exclude tests/PHPStan/Rules/Operators/data/bug-3585.php \
134+ --exclude tests/PHPStan/Rules/EnumCases/data/bug-14252.php \
134135 src tests
135136
136137install-paratest :
Original file line number Diff line number Diff line change 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 ->isInTrait () && $ scope ->isInClass () && $ scope ->getClassReflection ()->isEnum ()) {
26+ return [];
27+ }
28+
29+ return [
30+ RuleErrorBuilder::message ('Enum case can only be used in enums. ' )
31+ ->nonIgnorable ()
32+ ->identifier ('enum.caseOutsideOfEnum ' )
33+ ->build (),
34+ ];
35+ }
36+
37+ }
Original file line number Diff line number Diff line change 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+ 'Enum case can only be used in enums. ' ,
34+ 19 ,
35+ ],
36+ ]);
37+ }
38+
39+ }
Original file line number Diff line number Diff line change 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+ trait Baz
18+ {
19+ case Active;
20+ }
21+
22+ class BazConsumer
23+ {
24+ use Baz;
25+ }
26+
27+ enum Qux
28+ {
29+ case Active;
30+ }
You can’t perform that action at this time.
0 commit comments