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
51 changes: 51 additions & 0 deletions src/Rules/EnumCases/EnumCaseOutsideEnumRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?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->isInTrait()) {
return [
RuleErrorBuilder::message('Enum case can only be used in enums.')
->nonIgnorable()
->identifier('enum.caseOutsideOfEnum')
->build(),
];
}

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(),
];
}

}
39 changes: 39 additions & 0 deletions tests/PHPStan/Rules/EnumCases/EnumCaseOutsideEnumRuleTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?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,
],
[
'Enum case can only be used in enums.',
19,
],
]);
}

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

declare(strict_types = 1);

namespace Bug14252;

class Foo
{
case Active;
}

interface Bar
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Misses a test for a trait which uses a enum case

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tests completed successfully (the one failure is the pre-existing RawErrorFormatterTest issue, unrelated to our changes). Everything is committed and pushed.

{
case Active;
}

trait Baz
{
case Active;
}

class BazConsumer
{
use Baz;
}

enum Qux
{
case Active;
}
Loading