Skip to content

Commit c12e845

Browse files
Improve trim on numeric string
1 parent 5878035 commit c12e845

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

src/Type/Php/LtrimFunctionReturnTypeExtension.php

Lines changed: 3 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;
@@ -69,6 +70,8 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
6970
}
7071
} elseif ($trimConstantString->getValue() === '\\' && $string->isClassString()->yes()) {
7172
$result[] = new ClassStringType();
73+
} elseif (strpbrk($trimConstantString->getValue(), '0123456789') === false && $string->isNumericString()->yes()) {
74+
$result[] = new AccessoryNumericStringType();
7275
} else {
7376
return $defaultType;
7477
}

src/Type/Php/TrimFunctionDynamicReturnTypeExtension.php

Lines changed: 13 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;
@@ -66,18 +67,20 @@ public function getTypeFromFunctionCall(
6667
$functionName = $functionReflection->getName();
6768

6869
foreach ($trimConstantStrings as $trimConstantString) {
69-
if (count($stringConstantStrings) === 0) {
70+
if (count($stringConstantStrings) > 0) {
71+
foreach ($stringConstantStrings as $stringConstantString) {
72+
$result[] = new ConstantStringType(
73+
$functionName === 'rtrim'
74+
? rtrim($stringConstantString->getValue(), $trimConstantString->getValue())
75+
: trim($stringConstantString->getValue(), $trimConstantString->getValue()),
76+
true,
77+
);
78+
}
79+
} elseif (strpbrk($trimConstantString->getValue(), '0123456789') === false && $stringType->isNumericString()->yes()) {
80+
$result[] = new AccessoryNumericStringType();
81+
} else {
7082
return $defaultType;
7183
}
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-
}
8184
}
8285

8386
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)