Skip to content

Commit d69f930

Browse files
VincentLangletondrejmirtes
authored andcommitted
Fix and add more cases
1 parent c90386c commit d69f930

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/Reflection/InitializerExprTypeResolver.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,9 @@ public function resolveConcatType(Type $left, Type $right): Type
588588

589589
$leftNumericStringNonEmpty = TypeCombinator::remove($leftStringType, new ConstantStringType(''));
590590
if ($leftNumericStringNonEmpty->isNumericString()->yes()) {
591-
$allowedRightPattern = $left->isInteger()->yes() ? '#^[0-9.]+$#' : '#^[0-9]+$#';
591+
$allowedRightPattern = $left->isInteger()->yes()
592+
? '#^(\d+|\d+.\d+)([eE][+-]?\d+)?$#' // non-negative integer, float or scientific string
593+
: '#^\d+$#'; // non-negative integer string
592594

593595
$allRightConstantsZeroOrMore = false;
594596
foreach ($rightConstantStrings as $rightConstantString) {

tests/PHPStan/Analyser/nsrt/bug-11129.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@ public function foo(
5151
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.$maybeFloatConstStrings);
5252
assertType('lowercase-string&non-falsy-string&uppercase-string', $maybeFloatConstStrings.$i);
5353

54+
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.'1');
55+
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.'1.0');
56+
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'1.1.1');
57+
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'-1');
58+
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'-1.0');
59+
assertType('lowercase-string&non-falsy-string&numeric-string', $i.'10e-3');
60+
assertType('lowercase-string&non-falsy-string', $i.'-10e-3');
61+
assertType('non-falsy-string&numeric-string&uppercase-string', $i.'10E3');
62+
assertType('non-falsy-string&uppercase-string', $i.'-10E3');
63+
assertType('non-falsy-string', $i.'10eE3');
64+
5465
assertType('lowercase-string&non-empty-string&numeric-string&uppercase-string', $i.$bool);
5566
assertType('lowercase-string&non-empty-string&uppercase-string', $bool.$i);
5667
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $positiveInt.$bool);
@@ -75,7 +86,7 @@ public function foo(
7586
// https://3v4l.org/Ia4r0
7687
$scientificFloatAsString = '3e4';
7788
assertType('non-falsy-string', $numericString.$scientificFloatAsString);
78-
assertType('lowercase-string&non-falsy-string', $i.$scientificFloatAsString);
89+
assertType('lowercase-string&non-falsy-string&numeric-string', $i.$scientificFloatAsString);
7990
assertType('non-falsy-string', $scientificFloatAsString.$numericString);
8091
assertType('lowercase-string&non-falsy-string', $scientificFloatAsString.$i);
8192
}

0 commit comments

Comments
 (0)