Skip to content

Commit 6787e1d

Browse files
phpstan-botclaude
andcommitted
Remove $gotGreater/$gotSmaller in favor of direct $newMin/$newMax comparisons
Simplify the integer generalization logic in generalizeType() by removing the $gotGreater and $gotSmaller boolean flags. Instead, compute $newMin/$newMax in the same loop and check $newMax > $max / $newMin < $min directly. Also applies the symmetric fix for integer ranges (was still using new IntegerType() instead of IntegerRangeType::fromInterval()). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 992768b commit 6787e1d

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

src/Analyser/MutatingScope.php

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4100,26 +4100,20 @@ private function generalizeType(Type $a, Type $b, int $depth): Type
41004100

41014101
$newMin = $min;
41024102
$newMax = $max;
4103-
$gotGreater = false;
4104-
$gotSmaller = false;
41054103
foreach ($constantIntegers['b'] as $int) {
4106-
if ($int->getValue() > $max) {
4104+
if ($int->getValue() > $newMax) {
41074105
$newMax = $int->getValue();
4108-
$gotGreater = true;
41094106
}
4110-
if ($int->getValue() >= $min) {
4111-
continue;
4107+
if ($int->getValue() < $newMin) {
4108+
$newMin = $int->getValue();
41124109
}
4113-
4114-
$newMin = $int->getValue();
4115-
$gotSmaller = true;
41164110
}
41174111

4118-
if ($gotGreater && $gotSmaller) {
4112+
if ($newMax > $max && $newMin < $min) {
41194113
$resultTypes[] = IntegerRangeType::fromInterval($newMin, $newMax);
4120-
} elseif ($gotGreater) {
4114+
} elseif ($newMax > $max) {
41214115
$resultTypes[] = IntegerRangeType::fromInterval($min, null);
4122-
} elseif ($gotSmaller) {
4116+
} elseif ($newMin < $min) {
41234117
$resultTypes[] = IntegerRangeType::fromInterval(null, $max);
41244118
} else {
41254119
$resultTypes[] = TypeCombinator::union($constantIntegersA, $constantIntegersB);
@@ -4164,8 +4158,8 @@ private function generalizeType(Type $a, Type $b, int $depth): Type
41644158
$max = $rangeMax;
41654159
}
41664160

4167-
$gotGreater = false;
4168-
$gotSmaller = false;
4161+
$newMin = $min;
4162+
$newMax = $max;
41694163
foreach ($integerRanges['b'] as $range) {
41704164
if ($range->getMin() === null) {
41714165
$rangeMin = PHP_INT_MIN;
@@ -4178,14 +4172,12 @@ private function generalizeType(Type $a, Type $b, int $depth): Type
41784172
$rangeMax = $range->getMax();
41794173
}
41804174

4181-
if ($rangeMax > $max) {
4182-
$gotGreater = true;
4175+
if ($rangeMax > $newMax) {
4176+
$newMax = $rangeMax;
41834177
}
4184-
if ($rangeMin >= $min) {
4185-
continue;
4178+
if ($rangeMin < $newMin) {
4179+
$newMin = $rangeMin;
41864180
}
4187-
4188-
$gotSmaller = true;
41894181
}
41904182

41914183
if ($min === PHP_INT_MIN) {
@@ -4194,12 +4186,18 @@ private function generalizeType(Type $a, Type $b, int $depth): Type
41944186
if ($max === PHP_INT_MAX) {
41954187
$max = null;
41964188
}
4189+
if ($newMin === PHP_INT_MIN) {
4190+
$newMin = null;
4191+
}
4192+
if ($newMax === PHP_INT_MAX) {
4193+
$newMax = null;
4194+
}
41974195

4198-
if ($gotGreater && $gotSmaller) {
4199-
$resultTypes[] = new IntegerType();
4200-
} elseif ($gotGreater) {
4196+
if ($newMax !== $max && $newMin !== $min) {
4197+
$resultTypes[] = IntegerRangeType::fromInterval($newMin, $newMax);
4198+
} elseif ($newMax !== $max) {
42014199
$resultTypes[] = IntegerRangeType::fromInterval($min, null);
4202-
} elseif ($gotSmaller) {
4200+
} elseif ($newMin !== $min) {
42034201
$resultTypes[] = IntegerRangeType::fromInterval(null, $max);
42044202
} else {
42054203
$resultTypes[] = TypeCombinator::union($integerRangesA, $integerRangesB);

0 commit comments

Comments
 (0)