Skip to content

Commit 1713ab6

Browse files
Improve
1 parent dbe3ed4 commit 1713ab6

File tree

2 files changed

+20
-15
lines changed

2 files changed

+20
-15
lines changed

src/Rules/Classes/EnumSanityRule.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\DependencyInjection\RegisteredRule;
88
use PHPStan\Node\InClassNode;
9+
use PHPStan\Reflection\InitializerExprContext;
10+
use PHPStan\Reflection\InitializerExprTypeResolver;
911
use PHPStan\Rules\Rule;
1012
use PHPStan\Rules\RuleErrorBuilder;
1113
use PHPStan\ShouldNotHappenException;
@@ -34,6 +36,12 @@ final class EnumSanityRule implements Rule
3436
'__invoke' => true,
3537
];
3638

39+
public function __construct(
40+
private InitializerExprTypeResolver $initializerExprTypeResolver,
41+
)
42+
{
43+
}
44+
3745
public function getNodeType(): string
3846
{
3947
return InClassNode::class;
@@ -149,20 +157,14 @@ public function processNode(Node $node, Scope $scope): array
149157
$caseName = $stmt->name->name;
150158

151159
if ($enumNode->scalarType === null && $stmt->expr !== null) {
152-
$value = null;
153-
if (
154-
$stmt->expr instanceof Node\Scalar\Int_
155-
|| $stmt->expr instanceof Node\Scalar\String_
156-
|| $stmt->expr instanceof Node\Scalar\Float_
157-
) {
158-
$value = $stmt->expr->value;
159-
}
160-
161160
$errors[] = RuleErrorBuilder::message(sprintf(
162-
'Enum %s is not backed, but case %s has value%s.',
161+
'Enum %s is not backed, but case %s has value %s.',
163162
$classReflection->getDisplayName(),
164163
$caseName,
165-
$value !== null ? ' ' . $value : '',
164+
$this->initializerExprTypeResolver->getType(
165+
$stmt->expr,
166+
InitializerExprContext::fromScope($scope)
167+
)->describe(VerbosityLevel::value()),
166168
))
167169
->identifier('enum.caseWithValue')
168170
->line($stmt->getStartLine())

tests/PHPStan/Rules/Classes/EnumSanityRuleTest.php

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Rules\Classes;
44

5+
use PHPStan\Reflection\InitializerExprTypeResolver;
56
use PHPStan\Rules\Rule;
67
use PHPStan\Testing\RuleTestCase;
78
use PHPUnit\Framework\Attributes\RequiresPhp;
@@ -14,7 +15,9 @@ class EnumSanityRuleTest extends RuleTestCase
1415

1516
protected function getRule(): Rule
1617
{
17-
return new EnumSanityRule();
18+
return new EnumSanityRule(
19+
self::getContainer()->getByType(InitializerExprTypeResolver::class)
20+
);
1821
}
1922

2023
#[RequiresPhp('>= 8.1')]
@@ -158,15 +161,15 @@ public function testBug13768(): void
158161
9,
159162
],
160163
[
161-
'Enum Bug13768\Order is not backed, but case D has value 3.',
164+
'Enum Bug13768\Order is not backed, but case D has value \'3\'.',
162165
10,
163166
],
164167
[
165-
'Enum Bug13768\Order is not backed, but case E has value.',
168+
'Enum Bug13768\Order is not backed, but case E has value false.',
166169
11,
167170
],
168171
[
169-
'Enum Bug13768\Order is not backed, but case F has value.',
172+
'Enum Bug13768\Order is not backed, but case F has value 1.',
170173
12,
171174
],
172175
[

0 commit comments

Comments
 (0)