From b031f5c70aa38404baee5d97decabe61b9799e26 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 | 1 + tests/PHPStan/Analyser/nsrt/bug-8886.php | 12 ++++++++++++ 3 files changed, 18 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 516a68397e..2e681891a1 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -229,6 +229,7 @@ private static function findTestFiles(): iterable yield __DIR__ . '/../Rules/Methods/data/bug-4801.php'; yield __DIR__ . '/../Rules/Arrays/data/narrow-superglobal.php'; yield __DIR__ . '/../Rules/Methods/data/bug-12927.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 0679c46d01d1385ebb9d60be391007cbd0f1bc4b 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 ac4cf733fb6e7909db2b1b7bfcb06427ac0fbcd1 Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 12:14:07 +0200 Subject: [PATCH 3/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 13c040507d42e654131416cb435b54cf55272304 Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 12:18:50 +0200 Subject: [PATCH 4/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 c0efe5919dc25bd3b5c22b45842ab20d938c5c9b Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Wed, 30 Apr 2025 13:13:18 +0200 Subject: [PATCH 5/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'); From 3d1d60135c0c0e7164161c4881902b49753aff78 Mon Sep 17 00:00:00 2001 From: Michael Bolli Date: Tue, 29 Jul 2025 12:16:41 +0000 Subject: [PATCH 6/6] replace test import/yield with a comment --- tests/PHPStan/Analyser/NodeScopeResolverTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/PHPStan/Analyser/NodeScopeResolverTest.php b/tests/PHPStan/Analyser/NodeScopeResolverTest.php index 2e681891a1..6f330a1d9e 100644 --- a/tests/PHPStan/Analyser/NodeScopeResolverTest.php +++ b/tests/PHPStan/Analyser/NodeScopeResolverTest.php @@ -229,7 +229,8 @@ private static function findTestFiles(): iterable yield __DIR__ . '/../Rules/Methods/data/bug-4801.php'; yield __DIR__ . '/../Rules/Arrays/data/narrow-superglobal.php'; yield __DIR__ . '/../Rules/Methods/data/bug-12927.php'; - yield __DIR__ . '/nsrt/bug-8886.php'; + + // note: files in ./nsrt will be automatically picked up } /**