Skip to content

Commit 34e36d9

Browse files
Rely on RuleLevelHelper in InvalidKeyInArrayItemRule
1 parent e3fd45f commit 34e36d9

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

src/Rules/Arrays/InvalidKeyInArrayItemRule.php

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@
44

55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
7-
use PHPStan\DependencyInjection\AutowiredParameter;
87
use PHPStan\DependencyInjection\RegisteredRule;
98
use PHPStan\Rules\Rule;
109
use PHPStan\Rules\RuleErrorBuilder;
11-
use PHPStan\Type\MixedType;
10+
use PHPStan\Rules\RuleLevelHelper;
11+
use PHPStan\Type\ErrorType;
12+
use PHPStan\Type\Type;
1213
use PHPStan\Type\VerbosityLevel;
1314
use function sprintf;
1415

@@ -20,8 +21,7 @@ final class InvalidKeyInArrayItemRule implements Rule
2021
{
2122

2223
public function __construct(
23-
#[AutowiredParameter]
24-
private bool $reportMaybes,
24+
private RuleLevelHelper $ruleLevelHelper,
2525
)
2626
{
2727
}
@@ -37,23 +37,28 @@ public function processNode(Node $node, Scope $scope): array
3737
return [];
3838
}
3939

40-
$dimensionType = $scope->getType($node->key);
40+
$dimensionType = $this->ruleLevelHelper->findTypeToCheck(
41+
$scope,
42+
$node->key,
43+
'',
44+
static fn (Type $dimType): bool => AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimType)->yes(),
45+
)->getType();
46+
if ($dimensionType instanceof ErrorType) {
47+
return [];
48+
}
49+
4150
$isSuperType = AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
42-
if ($isSuperType->no()) {
43-
return [
44-
RuleErrorBuilder::message(
45-
sprintf('Invalid array key type %s.', $dimensionType->describe(VerbosityLevel::typeOnly())),
46-
)->identifier('array.invalidKey')->build(),
47-
];
48-
} elseif ($this->reportMaybes && $isSuperType->maybe() && !$dimensionType instanceof MixedType) {
49-
return [
50-
RuleErrorBuilder::message(
51-
sprintf('Possibly invalid array key type %s.', $dimensionType->describe(VerbosityLevel::typeOnly())),
52-
)->identifier('array.invalidKey')->build(),
53-
];
51+
if ($isSuperType->yes()) {
52+
return [];
5453
}
5554

56-
return [];
55+
return [
56+
RuleErrorBuilder::message(sprintf(
57+
'%s array key type %s.',
58+
$isSuperType->no() ? 'Invalid' : 'Possibly invalid',
59+
$dimensionType->describe(VerbosityLevel::typeOnly())
60+
))->identifier('array.invalidKey')->build(),
61+
];
5762
}
5863

5964
}

tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace PHPStan\Rules\Arrays;
44

55
use PHPStan\Rules\Rule;
6+
use PHPStan\Rules\RuleLevelHelper;
67
use PHPStan\Testing\RuleTestCase;
78
use PHPUnit\Framework\Attributes\RequiresPhp;
89

@@ -14,7 +15,9 @@ class InvalidKeyInArrayItemRuleTest extends RuleTestCase
1415

1516
protected function getRule(): Rule
1617
{
17-
return new InvalidKeyInArrayItemRule(true);
18+
$ruleLevelHelper = new RuleLevelHelper(self::createReflectionProvider(), true, false, true, false, false, false, true);
19+
20+
return new InvalidKeyInArrayItemRule($ruleLevelHelper);
1821
}
1922

2023
public function testInvalidKey(): void

0 commit comments

Comments
 (0)