Skip to content

Commit 84f0514

Browse files
Improve maybe inferences
1 parent 6dbf9e4 commit 84f0514

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/Type/Php/ReplaceFunctionsDynamicReturnTypeExtension.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ private function getPreliminarilyResolvedTypeFromFunctionCall(
101101
}
102102
} elseif ($functionReflection->getName() === 'strtr' && isset($functionCall->getArgs()[1])) {
103103
// `strtr` has two signatures: `strtr($string1, $string2, $string3)` and `strtr($string1, $array)`
104-
$secondArgumentType = $scope->getType($functionCall->getArgs()[1]->value);
104+
$secondArgumentType = TypeCombinator::intersect(
105+
new ArrayType(new MixedType(), new MixedType()),
106+
$scope->getType($functionCall->getArgs()[1]->value)
107+
);
105108
if ($secondArgumentType->isArray()->yes()) {
106109
$replaceArgumentType = $secondArgumentType->getIterableValueType();
107110
}

tests/PHPStan/Analyser/nsrt/strtr.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
/**
88
* @param non-empty-string $nonEmptyString
99
* @param non-falsy-string $nonFalseyString
10+
* @param mixed $mixed
1011
*/
11-
function doFoo(string $s, $nonEmptyString, $nonFalseyString) {
12+
function doFoo(string $s, $nonEmptyString, $nonFalseyString, $mixed) {
1213
assertType('string', strtr($s, 'f', 'b'));
1314
assertType('string', strtr($s, ['f' => 'b']));
1415
assertType('string', strtr($s, ['f' => 'b', 'o' => 'a']));
@@ -36,4 +37,15 @@ function doFoo(string $s, $nonEmptyString, $nonFalseyString) {
3637
assertType('non-empty-string', strtr($nonFalseyString, [$s => $nonEmptyString]));
3738
assertType('non-falsy-string', strtr($nonFalseyString, [$nonEmptyString => $nonFalseyString]));
3839
assertType('non-falsy-string', strtr($nonFalseyString, [$nonFalseyString => $nonFalseyString]));
40+
41+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$s => $nonEmptyString] : null));
42+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$nonEmptyString => $nonEmptyString] : null));
43+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$nonFalseyString => $nonFalseyString] : null));
44+
45+
assertType('non-empty-string', strtr($nonFalseyString, rand(0, 1) ? [$s => $nonEmptyString] : null));
46+
assertType('non-falsy-string', strtr($nonFalseyString, rand(0, 1) ? [$nonEmptyString => $nonFalseyString] : null));
47+
assertType('non-falsy-string', strtr($nonFalseyString, rand(0, 1) ? [$nonFalseyString => $nonFalseyString] : null));
48+
49+
assertType('string', strtr($nonEmptyString, $mixed));
50+
assertType('string', strtr($nonFalseyString, $mixed));
3951
}

0 commit comments

Comments
 (0)