Skip to content

Commit 32d5be0

Browse files
Report float and null offset based on PHP version
1 parent a5aa2ce commit 32d5be0

File tree

6 files changed

+44
-11
lines changed

6 files changed

+44
-11
lines changed

src/Php/PhpVersion.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,14 @@ public function hasPDOSubclasses(): bool
414414
return $this->versionId >= 80400;
415415
}
416416

417+
public function deprecatesImplicitlyFloatConversionToInt(): bool
418+
{
419+
return $this->versionId >= 80100;
420+
}
421+
422+
public function deprecatesNullArrayOffset(): bool
423+
{
424+
return $this->versionId >= 80500;
425+
}
426+
417427
}

src/Rules/Arrays/AllowedArrayKeysTypes.php

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

33
namespace PHPStan\Rules\Arrays;
44

5+
use PHPStan\Php\PhpVersion;
56
use PHPStan\Type\ArrayType;
67
use PHPStan\Type\BooleanType;
78
use PHPStan\Type\Constant\ConstantBooleanType;
@@ -21,15 +22,22 @@
2122
final class AllowedArrayKeysTypes
2223
{
2324

24-
public static function getType(): Type
25+
public static function getType(?PhpVersion $phpVersion = null): Type
2526
{
26-
return new UnionType([
27+
$types = [
2728
new IntegerType(),
2829
new StringType(),
29-
new FloatType(),
3030
new BooleanType(),
31-
new NullType(),
32-
]);
31+
];
32+
33+
if ($phpVersion === null || !$phpVersion->deprecatesImplicitlyFloatConversionToInt()) {
34+
$types[] = new FloatType();
35+
}
36+
if ($phpVersion === null || !$phpVersion->deprecatesNullArrayOffset()) {
37+
$types[] = new NullType();
38+
}
39+
40+
return new UnionType($types);
3341
}
3442

3543
public static function narrowOffsetKeyType(Type $varType, Type $keyType): ?Type

src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use PHPStan\Analyser\Scope;
77
use PHPStan\DependencyInjection\AutowiredParameter;
88
use PHPStan\DependencyInjection\RegisteredRule;
9+
use PHPStan\Php\PhpVersion;
910
use PHPStan\Rules\Rule;
1011
use PHPStan\Rules\RuleErrorBuilder;
1112
use PHPStan\Rules\RuleLevelHelper;
@@ -23,6 +24,7 @@ final class InvalidKeyInArrayDimFetchRule implements Rule
2324

2425
public function __construct(
2526
private RuleLevelHelper $ruleLevelHelper,
27+
private PhpVersion $phpVersion,
2628
#[AutowiredParameter]
2729
private bool $reportMaybes,
2830
)
@@ -56,17 +58,18 @@ public function processNode(Node $node, Scope $scope): array
5658
return [];
5759
}
5860

61+
$phpVersion = $this->phpVersion;
5962
$dimensionType = $this->ruleLevelHelper->findTypeToCheck(
6063
$scope,
6164
$node->dim,
6265
'',
63-
static fn (Type $dimType): bool => AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimType)->yes(),
66+
static fn (Type $dimType): bool => AllowedArrayKeysTypes::getType($phpVersion)->isSuperTypeOf($dimType)->yes(),
6467
)->getType();
6568
if ($dimensionType instanceof ErrorType) {
6669
return [];
6770
}
6871

69-
$isSuperType = AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
72+
$isSuperType = AllowedArrayKeysTypes::getType($phpVersion)->isSuperTypeOf($dimensionType);
7073
if ($isSuperType->yes() || ($isSuperType->maybe() && !$this->reportMaybes)) {
7174
return [];
7275
}

src/Rules/Arrays/InvalidKeyInArrayItemRule.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use PhpParser\Node;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\DependencyInjection\RegisteredRule;
8+
use PHPStan\Php\PhpVersion;
89
use PHPStan\Rules\Rule;
910
use PHPStan\Rules\RuleErrorBuilder;
1011
use PHPStan\Rules\RuleLevelHelper;
@@ -22,6 +23,7 @@ final class InvalidKeyInArrayItemRule implements Rule
2223

2324
public function __construct(
2425
private RuleLevelHelper $ruleLevelHelper,
26+
private PhpVersion $phpVersion,
2527
)
2628
{
2729
}
@@ -37,17 +39,18 @@ public function processNode(Node $node, Scope $scope): array
3739
return [];
3840
}
3941

42+
$phpVersion = $this->phpVersion;
4043
$dimensionType = $this->ruleLevelHelper->findTypeToCheck(
4144
$scope,
4245
$node->key,
4346
'',
44-
static fn (Type $dimType): bool => AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimType)->yes(),
47+
static fn (Type $dimType): bool => AllowedArrayKeysTypes::getType($phpVersion)->isSuperTypeOf($dimType)->yes(),
4548
)->getType();
4649
if ($dimensionType instanceof ErrorType) {
4750
return [];
4851
}
4952

50-
$isSuperType = AllowedArrayKeysTypes::getType()->isSuperTypeOf($dimensionType);
53+
$isSuperType = AllowedArrayKeysTypes::getType($phpVersion)->isSuperTypeOf($dimensionType);
5154
if ($isSuperType->yes()) {
5255
return [];
5356
}

tests/PHPStan/Rules/Arrays/InvalidKeyInArrayDimFetchRuleTest.php

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

33
namespace PHPStan\Rules\Arrays;
44

5+
use PHPStan\Php\PhpVersion;
56
use PHPStan\Rules\Rule;
67
use PHPStan\Rules\RuleLevelHelper;
78
use PHPStan\Testing\RuleTestCase;
@@ -16,7 +17,11 @@ class InvalidKeyInArrayDimFetchRuleTest extends RuleTestCase
1617
protected function getRule(): Rule
1718
{
1819
$ruleLevelHelper = new RuleLevelHelper(self::createReflectionProvider(), true, false, true, true, true, false, true);
19-
return new InvalidKeyInArrayDimFetchRule($ruleLevelHelper, true);
20+
return new InvalidKeyInArrayDimFetchRule(
21+
$ruleLevelHelper,
22+
self::getContainer()->getByType(PhpVersion::class),
23+
true,
24+
);
2025
}
2126

2227
public function testInvalidKey(): void

tests/PHPStan/Rules/Arrays/InvalidKeyInArrayItemRuleTest.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace PHPStan\Rules\Arrays;
44

5+
use PHPStan\Php\PhpVersion;
56
use PHPStan\Rules\Rule;
67
use PHPStan\Rules\RuleLevelHelper;
78
use PHPStan\Testing\RuleTestCase;
@@ -21,7 +22,10 @@ protected function getRule(): Rule
2122
{
2223
$ruleLevelHelper = new RuleLevelHelper(self::createReflectionProvider(), true, false, true, $this->checkExplicitMixed, $this->checkImplicitMixed, false, true);
2324

24-
return new InvalidKeyInArrayItemRule($ruleLevelHelper);
25+
return new InvalidKeyInArrayItemRule(
26+
$ruleLevelHelper,
27+
self::getContainer()->getByType(PhpVersion::class),
28+
);
2529
}
2630

2731
public function testInvalidKey(): void

0 commit comments

Comments
 (0)