@@ -1446,30 +1446,38 @@ private function callOperatorTypeSpecifyingExtensions(Expr\BinaryOp $expr, Type
1446
1446
*/
1447
1447
private function resolveCommonMath (Expr \BinaryOp $ expr , Type $ leftType , Type $ rightType ): Type
1448
1448
{
1449
+ $ types = TypeCombinator::union ($ leftType , $ rightType );
1449
1450
$ leftNumberType = $ leftType ->toNumber ();
1450
1451
$ rightNumberType = $ rightType ->toNumber ();
1451
1452
1452
- if ($ rightNumberType instanceof IntegerRangeType || $ rightNumberType instanceof ConstantIntegerType || $ rightType instanceof UnionType) {
1453
+ if (
1454
+ !$ types instanceof MixedType
1455
+ && (
1456
+ $ rightNumberType instanceof IntegerRangeType
1457
+ || $ rightNumberType instanceof ConstantIntegerType
1458
+ || $ rightNumberType instanceof UnionType
1459
+ )
1460
+ ) {
1453
1461
if ($ leftNumberType instanceof IntegerRangeType || $ leftNumberType instanceof ConstantIntegerType) {
1454
1462
return $ this ->integerRangeMath (
1455
1463
$ leftNumberType ,
1456
1464
$ expr ,
1457
1465
$ rightNumberType ,
1458
1466
);
1459
- } elseif ($ leftType instanceof UnionType) {
1467
+ } elseif ($ leftNumberType instanceof UnionType) {
1460
1468
$ unionParts = [];
1461
1469
1462
- foreach ($ leftType ->getTypes () as $ type ) {
1470
+ foreach ($ leftNumberType ->getTypes () as $ type ) {
1463
1471
$ numberType = $ type ->toNumber ();
1464
1472
if ($ numberType instanceof IntegerRangeType || $ numberType instanceof ConstantIntegerType) {
1465
1473
$ unionParts [] = $ this ->integerRangeMath ($ numberType , $ expr , $ rightNumberType );
1466
1474
} else {
1467
- $ unionParts [] = $ type ;
1475
+ $ unionParts [] = $ numberType ;
1468
1476
}
1469
1477
}
1470
1478
1471
1479
$ union = TypeCombinator::union (...$ unionParts );
1472
- if ($ leftType instanceof BenevolentUnionType) {
1480
+ if ($ leftNumberType instanceof BenevolentUnionType) {
1473
1481
return TypeUtils::toBenevolentUnion ($ union )->toNumber ();
1474
1482
}
1475
1483
@@ -1482,7 +1490,6 @@ private function resolveCommonMath(Expr\BinaryOp $expr, Type $leftType, Type $ri
1482
1490
return $ specifiedTypes ;
1483
1491
}
1484
1492
1485
- $ types = TypeCombinator::union ($ leftType , $ rightType );
1486
1493
if (
1487
1494
$ leftType ->isArray ()->yes ()
1488
1495
|| $ rightType ->isArray ()->yes ()
0 commit comments