1
0
mirror of https://github.com/danog/psalm.git synced 2024-12-02 09:37:59 +01:00

Correct decrement min/max ranges

This commit is contained in:
robchett 2023-10-08 16:56:03 +01:00 committed by Robert Chettleburgh
parent ec5eae3347
commit d925bf5226
2 changed files with 26 additions and 2 deletions

View File

@ -24,6 +24,8 @@ use Psalm\Issue\PossiblyInvalidOperand;
use Psalm\Issue\PossiblyNullOperand;
use Psalm\Issue\StringIncrement;
use Psalm\IssueBuffer;
use Psalm\Node\Expr\BinaryOp\VirtualMinus;
use Psalm\Node\Expr\BinaryOp\VirtualPlus;
use Psalm\StatementsSource;
use Psalm\Type;
use Psalm\Type\Atomic;
@ -821,10 +823,15 @@ final class ArithmeticOpAnalyzer
$result_type = Type::getInt();
}
}
} else {
} elseif ($parent instanceof VirtualPlus) {
$start = $left_type_part instanceof TLiteralInt ? $left_type_part->value : 1;
$result_type = Type::combineUnionTypes(Type::getIntRange($start, null), $result_type);
} elseif ($parent instanceof VirtualMinus) {
$start = $left_type_part instanceof TLiteralInt ? $left_type_part->value : 1;
$result_type = Type::combineUnionTypes(Type::getIntRange(null, $start), $result_type);
} else {
$result_type = Type::combineUnionTypes(
$always_positive ? Type::getIntRange($start, null) : Type::getInt(true),
$always_positive ? Type::getIntRange(1, null) : Type::getInt(true),
$result_type,
);
}

View File

@ -972,6 +972,23 @@ class BinaryOperationTest extends TestCase
'$j' => 'int<100, 110>',
],
],
'decrementInLoop' => [
'code' => '<?php
for ($i = 10; $i > 0; $i--) {
if (rand(0,1)) {
break;
}
}
for ($j = 110; $j > 100; $j--) {
if (rand(0,1)) {
break;
}
}',
'assertions' => [
'$i' => 'int<0, 10>',
'$j' => 'int<100, 110>',
],
],
'coalesceFilterOutNullEvenWithTernary' => [
'code' => '<?php