From 311cccf7ca820327496da6da44ab7067d54cb183 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Wed, 5 Mar 2025 09:55:39 +0100 Subject: [PATCH 1/2] ForbidVariableTypeOverwriting: relax allowed narrowing and generalization --- src/Rule/ForbidVariableTypeOverwritingRule.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Rule/ForbidVariableTypeOverwritingRule.php b/src/Rule/ForbidVariableTypeOverwritingRule.php index acacbb9..d7106c2 100644 --- a/src/Rule/ForbidVariableTypeOverwritingRule.php +++ b/src/Rule/ForbidVariableTypeOverwritingRule.php @@ -60,10 +60,10 @@ public function processNode(Node $node, Scope $scope): array return []; } - if ( - !$previousVariableType->isSuperTypeOf($newVariableType)->yes() // allow narrowing - && !$newVariableType->isSuperTypeOf($previousVariableType)->yes() // allow generalization - ) { + $narrowing = $previousVariableType->accepts($newVariableType, true)->yes(); + $generalization = $newVariableType->accepts($previousVariableType, true)->yes(); + + if (!$narrowing && !$generalization) { $error = RuleErrorBuilder::message("Overwriting variable \$$variableName while changing its type from {$previousVariableType->describe(VerbosityLevel::precise())} to {$newVariableType->describe(VerbosityLevel::precise())}") ->identifier('shipmonk.variableTypeOverwritten') ->build(); From aff8b124b5d60d32408cfec3dd90b34b3ad2ae04 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Wed, 5 Mar 2025 13:39:05 +0100 Subject: [PATCH 2/2] Add test for int-float edgecase --- .../Rule/data/ForbidVariableTypeOverwritingRule/code.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/Rule/data/ForbidVariableTypeOverwritingRule/code.php b/tests/Rule/data/ForbidVariableTypeOverwritingRule/code.php index 9131f2b..da2cce5 100644 --- a/tests/Rule/data/ForbidVariableTypeOverwritingRule/code.php +++ b/tests/Rule/data/ForbidVariableTypeOverwritingRule/code.php @@ -151,3 +151,11 @@ function testEnumCaseChange() { function testIntToInt(int $positive, int $negative) { $positive = $negative; } + +function testFloatToInt(float $float, int $int) { + $float = $int; +} + +function testFIntToFloat(int $int, float $float) { + $int = $float; +}