From de52e42d5f6ad07fd32843e708751be31c42bfb9 Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Wed, 26 Oct 2022 12:09:30 +0200 Subject: [PATCH 1/2] keep literal string for simple str_replace --- .../StrReplaceReturnTypeProvider.php | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php b/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php index 2dfa3681691..5dbd1083af8 100644 --- a/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php +++ b/src/Psalm/Internal/Provider/ReturnTypeProvider/StrReplaceReturnTypeProvider.php @@ -10,6 +10,7 @@ use Psalm\Type\Atomic\TString; use Psalm\Type\Union; +use function call_user_func; use function count; use function in_array; @@ -50,7 +51,27 @@ public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $ev $return_type = Type::getString(); - if (in_array($function_id, ['preg_replace', 'preg_replace_callback'], true)) { + if (in_array($function_id, ['str_replace', 'str_ireplace'], true) + && $subject_type->isSingleStringLiteral() + ) { + $first_arg = $statements_source->node_data->getType($call_args[0]->value); + $second_arg = $statements_source->node_data->getType($call_args[1]->value); + if ($first_arg + && $second_arg && $first_arg->isSingleStringLiteral() + && $second_arg->isSingleStringLiteral() + ) { + /** + * @var string $replaced_string + */ + $replaced_string = call_user_func( + $function_id, + $first_arg->getSingleStringLiteral()->value, + $second_arg->getSingleStringLiteral()->value, + $subject_type->getSingleStringLiteral()->value + ); + $return_type = Type::getString($replaced_string); + } + } elseif (in_array($function_id, ['preg_replace', 'preg_replace_callback'], true)) { $return_type = new Union([new TString, new TNull()]); $codebase = $statements_source->getCodebase(); From e064a0c14dc708af46ef84a47df0dc6c9c8adf9a Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Wed, 26 Oct 2022 13:07:56 +0200 Subject: [PATCH 2/2] fix unrelated CI error --- tests/ReturnTypeProvider/DirnameTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/ReturnTypeProvider/DirnameTest.php b/tests/ReturnTypeProvider/DirnameTest.php index 5ba691a223d..e1b4d01d382 100644 --- a/tests/ReturnTypeProvider/DirnameTest.php +++ b/tests/ReturnTypeProvider/DirnameTest.php @@ -5,6 +5,8 @@ use Psalm\Tests\TestCase; use Psalm\Tests\Traits\ValidCodeAnalysisTestTrait; +use function addslashes; + use const DIRECTORY_SEPARATOR; class DirnameTest extends TestCase