Skip to content

Commit ffb94a4

Browse files
Fix
1 parent 7fcfbec commit ffb94a4

File tree

1 file changed

+30
-8
lines changed

1 file changed

+30
-8
lines changed

src/Type/Php/DateIntervalFormatDynamicReturnTypeExtension.php

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,20 @@
77
use PHPStan\Analyser\Scope;
88
use PHPStan\DependencyInjection\AutowiredService;
99
use PHPStan\Reflection\MethodReflection;
10-
use PHPStan\Type\Accessory\AccessoryLiteralStringType;
10+
use PHPStan\Type\Accessory\AccessoryLowercaseStringType;
1111
use PHPStan\Type\Accessory\AccessoryNonEmptyStringType;
12-
use PHPStan\Type\Constant\ConstantStringType;
12+
use PHPStan\Type\Accessory\AccessoryNonFalsyStringType;
13+
use PHPStan\Type\Accessory\AccessoryNumericStringType;
14+
use PHPStan\Type\Accessory\AccessoryUppercaseStringType;
1315
use PHPStan\Type\DynamicMethodReturnTypeExtension;
14-
use PHPStan\Type\GeneralizePrecision;
1516
use PHPStan\Type\IntersectionType;
1617
use PHPStan\Type\StringType;
1718
use PHPStan\Type\Type;
1819
use PHPStan\Type\TypeCombinator;
1920
use function count;
21+
use function is_numeric;
22+
use function strtolower;
23+
use function strtoupper;
2024

2125
#[AutowiredService]
2226
final class DateIntervalFormatDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension
@@ -57,13 +61,31 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method
5761
$possibleReturnTypes = [];
5862
foreach ($constantStrings as $string) {
5963
$value = $dateInterval->format($string->getValue());
60-
$possibleReturnTypes[] = new ConstantStringType($value);
64+
65+
$accessories = [];
66+
if (is_numeric($value)) {
67+
$accessories[] = new AccessoryNumericStringType();
68+
}
69+
if ($value !== '0' && $value !== '') {
70+
$accessories[] = new AccessoryNonFalsyStringType();
71+
} elseif ($value !== '') {
72+
$accessories[] = new AccessoryNonEmptyStringType();
73+
}
74+
if (strtolower($value) === $value) {
75+
$accessories[] = new AccessoryLowercaseStringType();
76+
}
77+
if (strtoupper($value) === $value) {
78+
$accessories[] = new AccessoryUppercaseStringType();
79+
}
80+
81+
if (count($accessories) === 0) {
82+
return null;
83+
}
84+
85+
$possibleReturnTypes[] = new IntersectionType([new StringType(), ...$accessories]);
6186
}
6287

63-
return TypeCombinator::remove(
64-
TypeCombinator::union(...$possibleReturnTypes)->generalize(GeneralizePrecision::moreSpecific()),
65-
new AccessoryLiteralStringType(),
66-
);
88+
return TypeCombinator::union(...$possibleReturnTypes);
6789
}
6890

6991
}

0 commit comments

Comments
 (0)