Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/Rules/EnumCases/EnumCaseOutsideEnumRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php declare(strict_types = 1);

namespace PHPStan\Rules\EnumCases;

use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\DependencyInjection\RegisteredRule;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleErrorBuilder;

/**
* @implements Rule<Node\Stmt\EnumCase>
*/
#[RegisteredRule(level: 0)]
final class EnumCaseOutsideEnumRule implements Rule
{

public function getNodeType(): string
{
return Node\Stmt\EnumCase::class;
}

public function processNode(Node $node, Scope $scope): array
{
if (!$scope->isInClass()) {
return [];
}

$classReflection = $scope->getClassReflection();
if ($classReflection->isEnum()) {
return [];
}

return [
RuleErrorBuilder::message('Enum case can only be used in enums.')
->nonIgnorable()
->identifier('enum.caseOutsideOfEnum')
->build(),
];
}

}
35 changes: 35 additions & 0 deletions tests/PHPStan/Rules/EnumCases/EnumCaseOutsideEnumRuleTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php declare(strict_types = 1);

namespace PHPStan\Rules\EnumCases;

use PHPStan\Rules\Rule;
use PHPStan\Testing\RuleTestCase;
use PHPUnit\Framework\Attributes\RequiresPhp;

/**
* @extends RuleTestCase<EnumCaseOutsideEnumRule>
*/
class EnumCaseOutsideEnumRuleTest extends RuleTestCase
{

protected function getRule(): Rule
{
return new EnumCaseOutsideEnumRule();
}

#[RequiresPhp('>= 8.1')]
public function testRule(): void
{
$this->analyse([__DIR__ . '/data/bug-14252.php'], [
[
'Enum case can only be used in enums.',
9,
],
[
'Enum case can only be used in enums.',
14,
],
]);
}

}
20 changes: 20 additions & 0 deletions tests/PHPStan/Rules/EnumCases/data/bug-14252.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php // lint >= 8.1

declare(strict_types = 1);

namespace Bug14252;

class Foo
{
case Active;
}

interface Bar
{
case Active;
}

enum Qux
{
case Active;
}
Loading