Skip to content

Commit 6657e32

Browse files
Fix and add more cases
1 parent 22f5850 commit 6657e32

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
@@ -506,7 +506,9 @@ public function resolveConcatType(Type $left, Type $right): Type
506506

507507
$leftNumericStringNonEmpty = TypeCombinator::remove($leftStringType, new ConstantStringType(''));
508508
if ($leftNumericStringNonEmpty->isNumericString()->yes()) {
509-
$allowedRightPattern = $left->isInteger()->yes() ? '#^[0-9.]+$#' : '#^[0-9]+$#';
509+
$allowedRightPattern = $left->isInteger()->yes()
510+
? '#^(\d+|\d+.\d+)([eE][+-]?\d+)?$#' // non-negative integer, float or scientific string
511+
: '#^\d+$#'; // non-negative integer string
510512

511513
$allRightConstantsZeroOrMore = false;
512514
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)