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:
parent
ec5eae3347
commit
d925bf5226
@ -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,
|
||||
);
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user