Skip to content

Commit

Permalink
implemented ConstantStringType inference for str_repeat
Browse files Browse the repository at this point in the history
  • Loading branch information
staabm committed Feb 22, 2022
1 parent 53563e9 commit f5b3cdf
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
10 changes: 10 additions & 0 deletions src/Type/Php/StrRepeatFunctionReturnTypeExtension.php
Expand Up @@ -12,9 +12,11 @@
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\IntegerRangeType;
use PHPStan\Type\IntersectionType;
use PHPStan\Type\NeverType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use function count;
use function str_repeat;

class StrRepeatFunctionReturnTypeExtension implements DynamicFunctionReturnTypeExtension
{
Expand Down Expand Up @@ -42,6 +44,14 @@ public function getTypeFromFunctionCall(
return new ConstantStringType('');
}

if ($multiplierType instanceof ConstantIntegerType && $multiplierType->getValue() < 0) {
return new NeverType();
}

if ($inputType instanceof ConstantStringType && $multiplierType instanceof ConstantIntegerType) {
return new ConstantStringType(str_repeat($inputType->getValue(), $multiplierType->getValue()));
}

$accessoryTypes = [];
if ($inputType->isNonEmptyString()->yes()) {
if (IntegerRangeType::fromInterval(1, null)->isSuperTypeOf($multiplierType)->yes()) {
Expand Down
6 changes: 4 additions & 2 deletions tests/PHPStan/Analyser/data/literal-string.php
Expand Up @@ -25,8 +25,10 @@ public function doFoo($literalString, string $string)

assertType('string', str_repeat($string, 10));
assertType('literal-string', str_repeat($literalString, 10));
assertType('literal-string', str_repeat('', 10));
assertType('literal-string&non-empty-string', str_repeat('foo', 10));
assertType("''", str_repeat('', 10));
assertType("'foofoofoofoofoofoofoofoofoofoo'", str_repeat('foo', 10));
assertType("'?,?,?,'", str_repeat('?,', 3));
assertType("*NEVER*", str_repeat('?,', -3));

assertType('non-empty-string', str_pad($string, 5, $string));
assertType('non-empty-string', str_pad($literalString, 5, $string));
Expand Down

0 comments on commit f5b3cdf

Please sign in to comment.