Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/Reflection/InitializerExprTypeResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,10 @@ public function resolveConcatType(Type $left, Type $right): Type

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

$allRightConstantsZeroOrMore = false;
foreach ($rightConstantStrings as $rightConstantString) {
if ($rightConstantString->getValue() === '') {
Expand All @@ -514,7 +518,7 @@ public function resolveConcatType(Type $left, Type $right): Type

if (
!is_numeric($rightConstantString->getValue())
|| Strings::match($rightConstantString->getValue(), '#^[0-9]+$#') === null
|| Strings::match($rightConstantString->getValue(), $allowedRightPattern) === null
) {
$allRightConstantsZeroOrMore = false;
break;
Expand Down
17 changes: 14 additions & 3 deletions tests/PHPStan/Analyser/nsrt/bug-11129.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,20 @@ public function foo(
assertType('lowercase-string&non-falsy-string', $i.$maybeNonNumericConstStrings);
assertType('lowercase-string&non-falsy-string', $maybeNonNumericConstStrings.$i);

assertType('lowercase-string&non-falsy-string&uppercase-string', $i.$maybeFloatConstStrings); // could be 'lowercase-string&non-falsy-string&numeric-string'
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.$maybeFloatConstStrings);
assertType('lowercase-string&non-falsy-string&uppercase-string', $maybeFloatConstStrings.$i);

assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.'1');
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $i.'1.0');
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'1.1.1');
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'-1');
assertType('lowercase-string&non-falsy-string&uppercase-string', $i.'-1.0');
assertType('lowercase-string&non-falsy-string&numeric-string', $i.'10e-3');
assertType('lowercase-string&non-falsy-string', $i.'-10e-3');
assertType('non-falsy-string&numeric-string&uppercase-string', $i.'10E3');
assertType('non-falsy-string&uppercase-string', $i.'-10E3');
assertType('non-falsy-string', $i.'10eE3');

assertType('lowercase-string&non-empty-string&numeric-string&uppercase-string', $i.$bool);
assertType('lowercase-string&non-empty-string&uppercase-string', $bool.$i);
assertType('lowercase-string&non-falsy-string&numeric-string&uppercase-string', $positiveInt.$bool);
Expand All @@ -68,14 +79,14 @@ public function foo(
assertType('non-falsy-string&numeric-string&uppercase-string', $float.$positiveInt);
assertType('non-falsy-string&uppercase-string', $float.$negativeInt);
assertType('non-falsy-string&uppercase-string', $float.$i);
assertType('non-falsy-string&uppercase-string', $i.$float); // could be 'non-falsy-string&numeric-string&uppercase-string'
assertType('non-falsy-string&uppercase-string', $i.$float);
assertType('non-falsy-string', $numericString.$float);
assertType('non-falsy-string', $numericString.$maybeFloatConstStrings);

// https://3v4l.org/Ia4r0
$scientificFloatAsString = '3e4';
assertType('non-falsy-string', $numericString.$scientificFloatAsString);
assertType('lowercase-string&non-falsy-string', $i.$scientificFloatAsString);
assertType('lowercase-string&non-falsy-string&numeric-string', $i.$scientificFloatAsString);
assertType('non-falsy-string', $scientificFloatAsString.$numericString);
assertType('lowercase-string&non-falsy-string', $scientificFloatAsString.$i);
}
Expand Down
Loading