From 65f55ab44d9e6023ffd1ebfd38ff7d5f03b9950a Mon Sep 17 00:00:00 2001 From: Pablo Largo Mohedano Date: Thu, 16 May 2024 12:06:01 +0200 Subject: [PATCH] Conditional return type for `SQLite3Result::fetchArray()` and `SQLite3Result::fetchAll()` --- bin/functionMetadata_original.php | 2 ++ resources/functionMap.php | 2 +- resources/functionMap_php85delta.php | 1 + resources/functionMetadata.php | 5 ++- .../nsrt/sqlite3-result-fetch-all-php85.php | 31 +++++++++++++++++++ .../nsrt/sqlite3-result-fetch-array.php | 31 +++++++++++++++++++ 6 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-all-php85.php create mode 100644 tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-array.php diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php index 6d6ca3ed77a..e3559e2827b 100644 --- a/bin/functionMetadata_original.php +++ b/bin/functionMetadata_original.php @@ -333,6 +333,8 @@ 'SplQueue::dequeue' => ['hasSideEffects' => true], + 'SQLite3Result::fetchArray' => ['hasSideEffects' => true], + 'XmlReader::next' => ['hasSideEffects' => true], 'XmlReader::read' => ['hasSideEffects' => true], ]; diff --git a/resources/functionMap.php b/resources/functionMap.php index 47057dfb5ed..b4f2cd8a2f1 100644 --- a/resources/functionMap.php +++ b/resources/functionMap.php @@ -10062,7 +10062,7 @@ 'SQLite3Result::__construct' => ['void'], 'SQLite3Result::columnName' => ['string', 'column_number'=>'int'], 'SQLite3Result::columnType' => ['int', 'column_number'=>'int'], -'SQLite3Result::fetchArray' => ['array|false', 'mode='=>'int'], +'SQLite3Result::fetchArray' => ['($mode is SQLITE3_NUM ? non-empty-list|false : ($mode is SQLITE3_ASSOC ? non-empty-array|false : non-empty-array|false))', 'mode='=>'int'], 'SQLite3Result::finalize' => ['bool'], 'SQLite3Result::numColumns' => ['int'], 'SQLite3Result::reset' => ['bool'], diff --git a/resources/functionMap_php85delta.php b/resources/functionMap_php85delta.php index 8b7b392a830..babbf418849 100644 --- a/resources/functionMap_php85delta.php +++ b/resources/functionMap_php85delta.php @@ -16,6 +16,7 @@ return [ 'new' => [ 'chr' => ['non-empty-string', 'ascii'=>'int<0,255>'], + 'SQLite3Result::fetchAll' => ['($mode is SQLITE3_NUM ? list>|false : ($mode is SQLITE3_ASSOC ? list>|false : list>|false))', 'mode='=>'int'], ], 'old' => [ 'chr' => ['non-empty-string', 'ascii'=>'int'], diff --git a/resources/functionMetadata.php b/resources/functionMetadata.php index 4ebbb532d99..f511815ec48 100644 --- a/resources/functionMetadata.php +++ b/resources/functionMetadata.php @@ -570,7 +570,6 @@ 'ReflectionMethod::isProtected' => ['hasSideEffects' => false], 'ReflectionMethod::isPublic' => ['hasSideEffects' => false], 'ReflectionMethod::isStatic' => ['hasSideEffects' => false], - 'ReflectionMethod::setAccessible' => ['hasSideEffects' => false], 'ReflectionNamedType::getName' => ['hasSideEffects' => false], 'ReflectionNamedType::isBuiltin' => ['hasSideEffects' => false], 'ReflectionParameter::getAttributes' => ['hasSideEffects' => false], @@ -605,7 +604,6 @@ 'ReflectionProperty::isProtected' => ['hasSideEffects' => false], 'ReflectionProperty::isPublic' => ['hasSideEffects' => false], 'ReflectionProperty::isStatic' => ['hasSideEffects' => false], - 'ReflectionProperty::setAccessible' => ['hasSideEffects' => false], 'ReflectionReference::getId' => ['hasSideEffects' => false], 'ReflectionType::isBuiltin' => ['hasSideEffects' => false], 'ReflectionUnionType::getTypes' => ['hasSideEffects' => false], @@ -620,6 +618,7 @@ 'ResourceBundle::getErrorCode' => ['hasSideEffects' => false], 'ResourceBundle::getErrorMessage' => ['hasSideEffects' => false], 'ResourceBundle::getIterator' => ['hasSideEffects' => false], + 'SQLite3Result::fetchArray' => ['hasSideEffects' => true], 'SQLiteException::__construct' => ['hasSideEffects' => false], 'SimpleXMLElement::__construct' => ['hasSideEffects' => false], 'SimpleXMLElement::children' => ['hasSideEffects' => false], @@ -1758,4 +1757,4 @@ 'zlib_encode' => ['hasSideEffects' => false], 'zlib_get_coding_type' => ['hasSideEffects' => false], -]; +]; \ No newline at end of file diff --git a/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-all-php85.php b/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-all-php85.php new file mode 100644 index 00000000000..8e480d76c8b --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-all-php85.php @@ -0,0 +1,31 @@ += 8.5 + +namespace Sqlite3ResultFetchAll; + +use SQLite3Result; +use function PHPStan\Testing\assertType; + +class Foo +{ + + public function fetchAllDefault(SQLite3Result $result): void + { + assertType('list>|false', $result->fetchAll()); + } + + public function fetchAllBoth(SQLite3Result $result): void + { + assertType('list>|false', $result->fetchAll(SQLITE3_BOTH)); + } + + public function fetchAllNum(SQLite3Result $result): void + { + assertType('list>|false', $result->fetchAll(SQLITE3_NUM)); + } + + public function fetchAllAssoc(SQLite3Result $result): void + { + assertType('list>|false', $result->fetchAll(SQLITE3_ASSOC)); + } + +} diff --git a/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-array.php b/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-array.php new file mode 100644 index 00000000000..e3af9489722 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/sqlite3-result-fetch-array.php @@ -0,0 +1,31 @@ +|false', $result->fetchArray()); + } + + public function fetchArrayBoth(SQLite3Result $result): void + { + assertType('non-empty-array|false', $result->fetchArray(SQLITE3_BOTH)); + } + + public function fetchArrayNum(SQLite3Result $result): void + { + assertType('non-empty-list|false', $result->fetchArray(SQLITE3_NUM)); + } + + public function fetchArrayAssoc(SQLite3Result $result): void + { + assertType('non-empty-array|false', $result->fetchArray(SQLITE3_ASSOC)); + } + +}