Skip to content

Commit a0dc9ed

Browse files
authored
Fix pathinfo() return type for union type flags
1 parent 8713b14 commit a0dc9ed

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

src/Type/Php/PathinfoFunctionDynamicReturnTypeExtension.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,24 @@ public function getTypeFromFunctionCall(
5454
}
5555

5656
$flagsType = $scope->getType($functionCall->getArgs()[1]->value);
57-
if ($flagsType instanceof ConstantIntegerType) {
58-
if ($flagsType->getValue() === $this->getConstant('PATHINFO_ALL')) {
59-
return $arrayType;
57+
58+
$scalarValues = $flagsType->getConstantScalarValues();
59+
if ($scalarValues !== []) {
60+
$pathInfoAll = $this->getConstant('PATHINFO_ALL');
61+
if ($pathInfoAll === null) {
62+
return null;
63+
}
64+
65+
$result = [];
66+
foreach ($scalarValues as $scalarValue) {
67+
if ($scalarValue === $pathInfoAll) {
68+
$result[] = $arrayType;
69+
} else {
70+
$result[] = new StringType();
71+
}
6072
}
6173

62-
return new StringType();
74+
return TypeCombinator::union(...$result);
6375
}
6476

6577
return TypeCombinator::union($arrayType, new StringType());

tests/PHPStan/Analyser/nsrt/pathinfo.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,23 @@
44

55
use function PHPStan\Testing\assertType;
66

7-
function doFoo(string $s, int $i) {
7+
/**
8+
* @param PATHINFO_BASENAME|PATHINFO_EXTENSION $flag
9+
*/
10+
function doFoo(string $s, int $i, $flag) {
811
assertType('array{dirname?: string, basename: string, extension?: string, filename: string}|string', pathinfo($s, $i));
912
assertType('array{dirname?: string, basename: string, extension?: string, filename: string}', pathinfo($s));
1013

1114
assertType('string', pathinfo($s, PATHINFO_DIRNAME));
1215
assertType('string', pathinfo($s, PATHINFO_BASENAME));
1316
assertType('string', pathinfo($s, PATHINFO_EXTENSION));
1417
assertType('string', pathinfo($s, PATHINFO_FILENAME));
18+
19+
assertType('string', pathinfo($s, $flag));
20+
if ($i === PATHINFO_ALL) {
21+
assertType('array{dirname?: string, basename: string, extension?: string, filename: string}', pathinfo($s, $i));
22+
}
23+
if ($i === PATHINFO_ALL || $i === PATHINFO_DIRNAME) {
24+
assertType('array{dirname?: string, basename: string, extension?: string, filename: string}|string', pathinfo($s, $i));
25+
}
1526
}

0 commit comments

Comments
 (0)