Skip to content

Commit 5d67f0c

Browse files
authored
Bleeding Edge - more precise RecursiveIteratorIterator::__construct() parameter types
1 parent 95bea51 commit 5d67f0c

File tree

4 files changed

+45
-4
lines changed

4 files changed

+45
-4
lines changed

resources/functionMap_bleedingEdge.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@
124124
'stream_socket_client' => ['resource|false', 'remoteaddress'=>'string', '&w_errcode='=>'int', '&w_errstring='=>'string', 'timeout='=>'float', 'flags='=>'int-mask<STREAM_CLIENT_CONNECT|STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_PERSISTENT>', 'context='=>'resource'],
125125
'stream_socket_enable_crypto' => ['0|bool', 'stream'=>'resource', 'enable'=>'bool', 'crypto_method='=>'STREAM_CRYPTO_METHOD_SSLv2_CLIENT|STREAM_CRYPTO_METHOD_SSLv3_CLIENT|STREAM_CRYPTO_METHOD_SSLv23_CLIENT|STREAM_CRYPTO_METHOD_ANY_CLIENT|STREAM_CRYPTO_METHOD_TLS_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT|STREAM_CRYPTO_METHOD_TLSv1_3_CLIENT|STREAM_CRYPTO_METHOD_SSLv2_SERVER|STREAM_CRYPTO_METHOD_SSLv3_SERVER|STREAM_CRYPTO_METHOD_SSLv23_SERVER|STREAM_CRYPTO_METHOD_ANY_SERVER|STREAM_CRYPTO_METHOD_TLS_SERVER|STREAM_CRYPTO_METHOD_TLSv1_0_SERVER|STREAM_CRYPTO_METHOD_TLSv1_1_SERVER|STREAM_CRYPTO_METHOD_TLSv1_2_SERVER|STREAM_CRYPTO_METHOD_TLSv1_3_SERVER', 'session_stream='=>'resource'],
126126
'extract' => ['0|positive-int', '&rw_var_array'=>'array', 'extract_type='=>'EXTR_OVERWRITE|EXTR_SKIP|EXTR_PREFIX_SAME|EXTR_PREFIX_ALL|EXTR_PREFIX_INVALID|EXTR_IF_EXISTS|EXTR_PREFIX_IF_EXISTS|EXTR_REFS', 'prefix='=>'string|null'],
127+
'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'RecursiveIteratorIterator::LEAVES_ONLY|RecursiveIteratorIterator::SELF_FIRST|RecursiveIteratorIterator::CHILD_FIRST', 'flags='=>'0|RecursiveIteratorIterator::CATCH_GET_CHILD'],
127128
],
128129
'old' => [
129130

stubs/iterable.stub

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,12 @@ class ArrayIterator implements SeekableIterator, ArrayAccess, Countable
157157
*/
158158
class RecursiveIteratorIterator
159159
{
160-
161160
/**
162161
* @param T $iterator
163-
* @param int $mode
164-
* @param int $flags
165162
*/
166163
public function __construct(
167164
$iterator,
168-
$mode = RecursiveIteratorIterator::LEAVES_ONLY,
165+
int $mode = RecursiveIteratorIterator::LEAVES_ONLY,
169166
int $flags = 0
170167
)
171168
{

tests/PHPStan/Rules/Classes/InstantiationRuleTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,4 +461,14 @@ public function testBug9946(): void
461461
$this->analyse([__DIR__ . '/data/bug-9946.php'], []);
462462
}
463463

464+
public function testBug10324(): void
465+
{
466+
$this->analyse([__DIR__ . '/data/bug-10324.php'], [
467+
[
468+
'Parameter #3 $flags of class RecursiveIteratorIterator constructor expects 0|16, 2 given.',
469+
23,
470+
],
471+
]);
472+
}
473+
464474
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
namespace Bug10324;
4+
5+
use RecursiveIteratorIterator;
6+
use RecursiveDirectoryIterator;
7+
8+
class HelloWorld
9+
{
10+
public function findfile(string $directory, string $filename): ?string
11+
{
12+
$fontPath = null;
13+
$it = new RecursiveDirectoryIterator(
14+
$directory,
15+
RecursiveDirectoryIterator::SKIP_DOTS
16+
| RecursiveDirectoryIterator::FOLLOW_SYMLINKS
17+
);
18+
foreach (
19+
new RecursiveIteratorIterator(
20+
$it,
21+
RecursiveIteratorIterator::LEAVES_ONLY,
22+
//RecursiveIteratorIterator::CATCH_GET_CHILD
23+
RecursiveIteratorIterator::CHILD_FIRST
24+
) as $file
25+
) {
26+
if (basename($file) === $filename) {
27+
$fontPath = $file;
28+
break;
29+
}
30+
}
31+
return $fontPath;
32+
}
33+
}

0 commit comments

Comments
 (0)