From 87eb83616e09155689c5509d526ef44fa8663762 Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Wed, 26 Oct 2022 12:54:00 +0200 Subject: [PATCH] add basename return type provider Like dirname return type provider of https://github.com/vimeo/psalm/pull/8611 --- .../Provider/FunctionReturnTypeProvider.php | 2 + .../BasenameReturnTypeProvider.php | 54 +++++++++++++++++++ tests/ReturnTypeProvider/BasenameTest.php | 36 +++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php create mode 100644 tests/ReturnTypeProvider/BasenameTest.php diff --git a/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php b/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php index 938b9ab7490..699c0dd8d37 100644 --- a/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php +++ b/src/Psalm/Internal/Provider/FunctionReturnTypeProvider.php @@ -21,6 +21,7 @@ use Psalm\Internal\Provider\ReturnTypeProvider\ArraySliceReturnTypeProvider; use Psalm\Internal\Provider\ReturnTypeProvider\ArraySpliceReturnTypeProvider; use Psalm\Internal\Provider\ReturnTypeProvider\ArrayUniqueReturnTypeProvider; +use Psalm\Internal\Provider\ReturnTypeProvider\BasenameReturnTypeProvider; use Psalm\Internal\Provider\ReturnTypeProvider\DirnameReturnTypeProvider; use Psalm\Internal\Provider\ReturnTypeProvider\ExplodeReturnTypeProvider; use Psalm\Internal\Provider\ReturnTypeProvider\FilterVarReturnTypeProvider; @@ -87,6 +88,7 @@ public function __construct() $this->registerClass(StrTrReturnTypeProvider::class); $this->registerClass(VersionCompareReturnTypeProvider::class); $this->registerClass(MktimeReturnTypeProvider::class); + $this->registerClass(BasenameReturnTypeProvider::class); $this->registerClass(DirnameReturnTypeProvider::class); $this->registerClass(ExplodeReturnTypeProvider::class); $this->registerClass(GetObjectVarsReturnTypeProvider::class); diff --git a/src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php b/src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php new file mode 100644 index 00000000000..ff399e7cc37 --- /dev/null +++ b/src/Psalm/Internal/Provider/ReturnTypeProvider/BasenameReturnTypeProvider.php @@ -0,0 +1,54 @@ + + */ + public static function getFunctionIds(): array + { + return ['basename']; + } + + public static function getFunctionReturnType(FunctionReturnTypeProviderEvent $event): ?Union + { + $call_args = $event->getCallArgs(); + if (count($call_args) === 0) { + return null; + } + + $statements_source = $event->getStatementsSource(); + + $evaled_path = IncludeAnalyzer::getPathTo( + $call_args[0]->value, + null, + null, + $statements_source->getFileName(), + $statements_source->getCodebase()->config + ); + + if ($evaled_path === null) { + return Type::getString(); + } + + $basename = basename($evaled_path); + + return Type::getString($basename); + } +} diff --git a/tests/ReturnTypeProvider/BasenameTest.php b/tests/ReturnTypeProvider/BasenameTest.php new file mode 100644 index 00000000000..5c624651f69 --- /dev/null +++ b/tests/ReturnTypeProvider/BasenameTest.php @@ -0,0 +1,36 @@ + [ + 'code' => ' [ + '$base===' => "'c'", + ], + ]; + + yield 'basenameOfStringPathReturnsString' => [ + 'code' => ' [ + '$base===' => 'string', + ], + ]; + } +}