Skip to content

Commit fab9bc1

Browse files
VincentLangletondrejmirtes
authored andcommitted
Improve trim on numeric string
1 parent 3e582f9 commit fab9bc1

File tree

3 files changed

+51
-10
lines changed

3 files changed

+51
-10
lines changed

src/Type/Php/LtrimFunctionReturnTypeExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\DependencyInjection\AutowiredService;
88
use PHPStan\Reflection\FunctionReflection;
99
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
10+
use PHPStan\Type\Accessory\AccessoryNumericStringType;
1011
use PHPStan\Type\Accessory\AccessoryUppercaseStringType;
1112
use PHPStan\Type\ClassStringType;
1213
use PHPStan\Type\Constant\ConstantStringType;
@@ -17,6 +18,7 @@
1718
use PHPStan\Type\TypeCombinator;
1819
use function count;
1920
use function ltrim;
21+
use function preg_match;
2022

2123
#[AutowiredService]
2224
final class LtrimFunctionReturnTypeExtension implements DynamicFunctionReturnTypeExtension
@@ -69,6 +71,8 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
6971
}
7072
} elseif ($trimConstantString->getValue() === '\\' && $string->isClassString()->yes()) {
7173
$result[] = new ClassStringType();
74+
} elseif (preg_match('/\d/', $trimConstantString->getValue()) === 0 && $string->isNumericString()->yes()) {
75+
$result[] = new AccessoryNumericStringType();
7276
} else {
7377
return $defaultType;
7478
}

src/Type/Php/TrimFunctionDynamicReturnTypeExtension.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use PHPStan\DependencyInjection\AutowiredService;
88
use PHPStan\Reflection\FunctionReflection;
99
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
10+
use PHPStan\Type\Accessory\AccessoryNumericStringType;
1011
use PHPStan\Type\Accessory\AccessoryUppercaseStringType;
1112
use PHPStan\Type\Constant\ConstantStringType;
1213
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
@@ -16,6 +17,7 @@
1617
use PHPStan\Type\TypeCombinator;
1718
use function count;
1819
use function in_array;
20+
use function preg_match;
1921
use function rtrim;
2022
use function trim;
2123

@@ -66,18 +68,20 @@ public function getTypeFromFunctionCall(
6668
$functionName = $functionReflection->getName();
6769

6870
foreach ($trimConstantStrings as $trimConstantString) {
69-
if (count($stringConstantStrings) === 0) {
71+
if (count($stringConstantStrings) > 0) {
72+
foreach ($stringConstantStrings as $stringConstantString) {
73+
$result[] = new ConstantStringType(
74+
$functionName === 'rtrim'
75+
? rtrim($stringConstantString->getValue(), $trimConstantString->getValue())
76+
: trim($stringConstantString->getValue(), $trimConstantString->getValue()),
77+
true,
78+
);
79+
}
80+
} elseif (preg_match('/\d/', $trimConstantString->getValue()) === 0 && $stringType->isNumericString()->yes()) {
81+
$result[] = new AccessoryNumericStringType();
82+
} else {
7083
return $defaultType;
7184
}
72-
73-
foreach ($stringConstantStrings as $stringConstantString) {
74-
$result[] = new ConstantStringType(
75-
$functionName === 'rtrim'
76-
? rtrim($stringConstantString->getValue(), $trimConstantString->getValue())
77-
: trim($stringConstantString->getValue(), $trimConstantString->getValue()),
78-
true,
79-
);
80-
}
8185
}
8286

8387
return TypeCombinator::union(...$result);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace NumericStringTrim;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
class Foo
8+
{
9+
10+
/**
11+
* @param numeric-string $numericString
12+
* @param string $string
13+
*/
14+
public function doTrim(string $numericString, string $string): void
15+
{
16+
assertType('string', trim($numericString, $string));
17+
assertType('string', ltrim($numericString, $string));
18+
assertType('string', rtrim($numericString, $string));
19+
20+
assertType('numeric-string', trim($numericString, '-'));
21+
assertType('numeric-string', ltrim($numericString, '-'));
22+
assertType('numeric-string', rtrim($numericString, '-'));
23+
24+
assertType('string', trim($numericString, '0'));
25+
assertType('string', ltrim($numericString, '0'));
26+
assertType('string', rtrim($numericString, '0'));
27+
28+
assertType('string', trim($numericString, '-0'));
29+
assertType('string', ltrim($numericString, '-0'));
30+
assertType('string', rtrim($numericString, '-0'));
31+
}
32+
33+
}

0 commit comments

Comments
 (0)