Skip to content

Commit 6a6e148

Browse files
Improve maybe inferences
1 parent 6dbf9e4 commit 6a6e148

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,12 @@ function doFoo(string $s, $nonEmptyString, $nonFalseyString) {
3636
assertType('non-empty-string', strtr($nonFalseyString, [$s => $nonEmptyString]));
3737
assertType('non-falsy-string', strtr($nonFalseyString, [$nonEmptyString => $nonFalseyString]));
3838
assertType('non-falsy-string', strtr($nonFalseyString, [$nonFalseyString => $nonFalseyString]));
39+
40+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$s => $nonEmptyString] : null));
41+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$nonEmptyString => $nonEmptyString] : null));
42+
assertType('non-empty-string', strtr($nonEmptyString, rand(0, 1) ? [$nonFalseyString => $nonFalseyString] : null));
43+
44+
assertType('non-empty-string', strtr($nonFalseyString, rand(0, 1) ? [$s => $nonEmptyString] : null));
45+
assertType('non-falsy-string', strtr($nonFalseyString, rand(0, 1) ? [$nonEmptyString => $nonFalseyString] : null));
46+
assertType('non-falsy-string', strtr($nonFalseyString, rand(0, 1) ? [$nonFalseyString => $nonFalseyString] : null));
3947
}

0 commit comments

Comments
 (0)