Skip to content

Commit 560ec03

Browse files
committed
Merge branch 2.1.x into 2.2.x
2 parents f676747 + bc73c0a commit 560ec03

File tree

4 files changed

+107
-0
lines changed

4 files changed

+107
-0
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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

136137
install-paratest:
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
}

0 commit comments

Comments
 (0)