From a40cea79b771398d28f0a024af8a69f9bd9f179b Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 11:26:13 +0200 Subject: [PATCH 1/6] fixes #8886 --- stubs/PDOStatement.stub | 5 +++++ tests/PHPStan/Analyser/NodeScopeResolverTest.php | 2 ++ tests/PHPStan/Analyser/nsrt/bug-8886.php | 12 ++++++++++++ 3 files changed, 19 insertions(+) create mode 100644 tests/PHPStan/Analyser/nsrt/bug-8886.php diff --git a/stubs/PDOStatement.stub b/stubs/PDOStatement.stub index 46d0be7c5d..f1b32e3d37 100644 --- a/stubs/PDOStatement.stub +++ b/stubs/PDOStatement.stub @@ -19,4 +19,9 @@ class PDOStatement implements Traversable, IteratorAggregate * @return array{name: string, table?: string, native_type?: string, len: int, flags: array, precision: int<0, max>, pdo_type: PDO::PARAM_* }|false */ public function getColumnMeta(int $column) {} + + /** + * @return Iterator + */ + public function getIterator() {} } diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php index a2e9ef0619..14e503a109 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -211,6 +211,8 @@ private static function findTestFiles(): iterable yield __DIR__ . '/../Rules/Arrays/data/bug-11679.php'; yield __DIR__ . '/../Rules/Methods/data/bug-4801.php'; yield __DIR__ . '/../Rules/Arrays/data/narrow-superglobal.php'; + + yield __DIR__ . '/nsrt/bug-8886.php'; } /** diff --git a/tests/PHPStan/Analyser/nsrt/bug-8886.php b/tests/PHPStan/Analyser/nsrt/bug-8886.php new file mode 100644 index 0000000000..76c8167ac4 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-8886.php @@ -0,0 +1,12 @@ +query('SELECT 1'); + assertType('Iterator', $stmt->getIterator()); +} From 07ff7ebea57d0ecb4019eb69cf34d86f3e1e9b15 Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 11:31:29 +0200 Subject: [PATCH 2/6] remove test file from NodeScopeResolverTest From edfea327071d57829934552934a4a8a1a536c41c Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 11:56:15 +0200 Subject: [PATCH 3/6] Update NodeScopeResolverTest.php --- tests/PHPStan/Analyser/NodeScopeResolverTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php index 14e503a109..a2e9ef0619 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -211,8 +211,6 @@ private static function findTestFiles(): iterable yield __DIR__ . '/../Rules/Arrays/data/bug-11679.php'; yield __DIR__ . '/../Rules/Methods/data/bug-4801.php'; yield __DIR__ . '/../Rules/Arrays/data/narrow-superglobal.php'; - - yield __DIR__ . '/nsrt/bug-8886.php'; } /** From ee52612ebfb8b09380c79727f295759fa997182b Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 12:14:07 +0200 Subject: [PATCH 4/6] PHP7.4 doesn't have `PDOStatement::getIterator()` --- tests/PHPStan/Analyser/nsrt/bug-8886.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/PHPStan/Analyser/nsrt/bug-8886.php b/tests/PHPStan/Analyser/nsrt/bug-8886.php index 76c8167ac4..066fe35797 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-8886.php +++ b/tests/PHPStan/Analyser/nsrt/bug-8886.php @@ -8,5 +8,12 @@ function testPDOStatementGetIterator(): void { $pdo = new PDO('sqlite::memory:'); $stmt = $pdo->query('SELECT 1'); - assertType('Iterator', $stmt->getIterator()); + + if (PHP_VERSION_ID >= 80000) { + // PHP 8 and above + assertType('Iterator', $stmt->getIterator()); + } else { + // Fallback for PHP 7.4 + assertType('Traversable', $stmt); + } } From e67fb84e55647673ec579280fcee4c5460266140 Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 12:18:50 +0200 Subject: [PATCH 5/6] early return --- tests/PHPStan/Analyser/nsrt/bug-8886.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/tests/PHPStan/Analyser/nsrt/bug-8886.php b/tests/PHPStan/Analyser/nsrt/bug-8886.php index 066fe35797..f127b53530 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-8886.php +++ b/tests/PHPStan/Analyser/nsrt/bug-8886.php @@ -6,14 +6,13 @@ use function PHPStan\Testing\assertType; function testPDOStatementGetIterator(): void { - $pdo = new PDO('sqlite::memory:'); + if (PHP_VERSION_ID < 80000) { + echo "Test skipped: PDOStatement::getIterator is only available in PHP 8 and above."; + return; + } + + $pdo = new PDO('sqlite::memory:'); $stmt = $pdo->query('SELECT 1'); - if (PHP_VERSION_ID >= 80000) { - // PHP 8 and above - assertType('Iterator', $stmt->getIterator()); - } else { - // Fallback for PHP 7.4 - assertType('Traversable', $stmt); - } + assertType('Iterator', $stmt->getIterator()); } From e705114f5c56d5461e71751ecf653e0a58776e6c Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 13:13:18 +0200 Subject: [PATCH 6/6] Use `// lint` --- tests/PHPStan/Analyser/nsrt/bug-8886.php | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/PHPStan/Analyser/nsrt/bug-8886.php b/tests/PHPStan/Analyser/nsrt/bug-8886.php index f127b53530..47a385dea5 100644 --- a/tests/PHPStan/Analyser/nsrt/bug-8886.php +++ b/tests/PHPStan/Analyser/nsrt/bug-8886.php @@ -1,4 +1,4 @@ -= 8.0 namespace Bug8886; @@ -6,11 +6,6 @@ use function PHPStan\Testing\assertType; function testPDOStatementGetIterator(): void { - if (PHP_VERSION_ID < 80000) { - echo "Test skipped: PDOStatement::getIterator is only available in PHP 8 and above."; - return; - } - $pdo = new PDO('sqlite::memory:'); $stmt = $pdo->query('SELECT 1');