Completed
Push — master ( 2216e2...5f11f8 )
by Théo
03:41 queued 41s
created

Reflector::isClassInternal()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
ccs 0
cts 0
cp 0
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the humbug/php-scoper package.
7
 *
8
 * Copyright (c) 2017 Théo FIDRY <[email protected]>,
9
 *                    Pádraic Brady <[email protected]>
10
 *
11
 * For the full copyright and license information, please view the LICENSE
12
 * file that was distributed with this source code.
13
 */
14
15
namespace Humbug\PhpScoper;
16
17
use Roave\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsMap;
18
use function array_fill_keys;
19
use function array_keys;
20
use function array_merge;
21
22
/**
23
 * TODO: check if the stubs map could be generated by jetbrains directly instead of being done in BetterReflection
24
 * since we use so little of it (and as a result makes more dependencies).
25
 *
26
 * @private
27
 */
28
final class Reflector
29
{
30
    private const MISSING_CLASSES = [
31
        // https://github.com/JetBrains/phpstorm-stubs/pull/600
32
        'UV',
33
34
        // https://github.com/JetBrains/phpstorm-stubs/pull/596
35
        'Crypto\Cipher',
36
        'Crypto\CipherException',
37
        'Crypto\Hash',
38
        'Crypto\HashException',
39
        'Crypto\MAC',
40
        'Crypto\MACException',
41
        'Crypto\HMAC',
42
        'Crypto\CMAC',
43
        'Crypto\KDF',
44
        'Crypto\KDFException',
45
        'Crypto\PBKDF2',
46
        'Crypto\PBKDF2Exception',
47
        'Crypto\Base64',
48
        'Crypto\Base64Exception',
49
        'Crypto\Rand',
50
        'Crypto\RandException',
51
52
        // https://github.com/JetBrains/phpstorm-stubs/pull/594
53
        'parallel\Channel',
54
        'parallel\Channel\Error',
55
        'parallel\Channel\Error\Closed',
56
        'parallel\Channel\Error\Existence',
57
        'parallel\Channel\Error\IllegalValue',
58
        'parallel\Error',
59
        'parallel\Events',
60
        'parallel\Events\Error',
61
        'parallel\Events\Error\Existence',
62
        'parallel\Events\Error\Timeout',
63
        'parallel\Events\Event',
64
        'parallel\Events\Event\Type',
65
        'parallel\Events\Input',
66
        'parallel\Events\Input\Error',
67
        'parallel\Events\Input\Error\Existence',
68
        'parallel\Events\Input\Error\IllegalValue',
69
        'parallel\Future',
70
        'parallel\Future\Error',
71
        'parallel\Future\Error\Cancelled',
72
        'parallel\Future\Error\Foreign',
73
        'parallel\Future\Error\Killed',
74
        'parallel\Runtime',
75
        'parallel\Runtime\Bootstrap',
76 571
        'parallel\Runtime\Error',
77
        'parallel\Runtime\Error\Bootstrap',
78 571
        'parallel\Runtime\Error\Closed',
79
        'parallel\Runtime\Error\IllegalFunction',
80
        'parallel\Runtime\Error\IllegalInstruction',
81 310
        'parallel\Runtime\Error\IllegalParameter',
82
        'parallel\Runtime\Error\IllegalReturn',
83
    ];
84 310
85 44
    private const MISSING_FUNCTIONS = [
86 44
        // https://github.com/JetBrains/phpstorm-stubs/pull/613
87
        'sapi_windows_vt100_support',
88
89
        // https://github.com/JetBrains/phpstorm-stubs/pull/600
90 98
        'uv_unref',
91
        'uv_last_error',
92 98
        'uv_err_name',
93 2
        'uv_strerror',
94
        'uv_update_time',
95
        'uv_ref',
96
        'uv_run',
97 96
        'uv_run_once',
98 77
        'uv_loop_delete',
99 77
        'uv_now',
100
        'uv_tcp_bind',
101
        'uv_tcp_bind6',
102
        'uv_write',
103 79
        'uv_write2',
104
        'uv_tcp_nodelay',
105 79
        'uv_accept',
106 1
        'uv_shutdown',
107
        'uv_close',
108
        'uv_read_start',
109 78
        'uv_read2_start',
110
        'uv_read_stop',
111
        'uv_ip4_addr',
112 78
        'uv_ip6_addr',
113
        'uv_listen',
114 78
        'uv_tcp_connect',
115 28
        'uv_tcp_connect6',
116
        'uv_timer_init',
117
        'uv_timer_start',
118 78
        'uv_timer_stop',
119
        'uv_timer_again',
120 78
        'uv_timer_set_repeat',
121
        'uv_timer_get_repeat',
122 78
        'uv_idle_init',
123
        'uv_idle_start',
124 78
        'uv_idle_stop',
125
        'uv_getaddrinfo',
126
        'uv_tcp_init',
127
        'uv_default_loop',
128
        'uv_loop_new',
129
        'uv_udp_init',
130
        'uv_udp_bind',
131
        'uv_udp_bind6',
132
        'uv_udp_recv_start',
133
        'uv_udp_recv_stop',
134
        'uv_udp_set_membership',
135
        'uv_udp_set_multicast_loop',
136
        'uv_udp_set_multicast_ttl',
137
        'uv_udp_set_broadcast',
138
        'uv_udp_send',
139
        'uv_udp_send6',
140
        'uv_is_active',
141
        'uv_is_readable',
142
        'uv_is_writable',
143
        'uv_walk',
144
        'uv_guess_handle',
145
        'uv_handle_type',
146
        'uv_pipe_init',
147
        'uv_pipe_open',
148
        'uv_pipe_bind',
149
        'uv_pipe_connect',
150
        'uv_pipe_pending_instances',
151
        'uv_ares_init_options',
152
        'ares_gethostbyname',
153
        'uv_loadavg',
154
        'uv_uptime',
155
        'uv_get_free_memory',
156
        'uv_get_total_memory',
157
        'uv_hrtime',
158
        'uv_exepath',
159
        'uv_cpu_info',
160
        'uv_interface_addresses',
161
        'uv_stdio_new',
162
        'uv_spawn',
163
        'uv_process_kill',
164
        'uv_kill',
165
        'uv_chdir',
166
        'uv_rwlock_init',
167
        'uv_rwlock_rdlock',
168
        'uv_rwlock_tryrdlock',
169
        'uv_rwlock_rdunlock',
170
        'uv_rwlock_wrlock',
171
        'uv_rwlock_trywrlock',
172
        'uv_rwlock_wrunlock',
173
        'uv_mutex_init',
174
        'uv_mutex_lock',
175
        'uv_mutex_trylock',
176
        'uv_sem_init',
177
        'uv_sem_post',
178
        'uv_sem_wait',
179
        'uv_sem_trywait',
180
        'uv_prepare_init',
181
        'uv_prepare_start',
182
        'uv_prepare_stop',
183
        'uv_check_init',
184
        'uv_check_start',
185
        'uv_check_stop',
186
        'uv_async_init',
187
        'uv_async_send',
188
        'uv_queue_work',
189
        'uv_fs_open',
190
        'uv_fs_read',
191
        'uv_fs_close',
192
        'uv_fs_write',
193
        'uv_fs_fsync',
194
        'uv_fs_fdatasync',
195
        'uv_fs_ftruncate',
196
        'uv_fs_mkdir',
197
        'uv_fs_rmdir',
198
        'uv_fs_unlink',
199
        'uv_fs_rename',
200
        'uv_fs_utime',
201
        'uv_fs_futime',
202
        'uv_fs_chmod',
203
        'uv_fs_fchmod',
204
        'uv_fs_chown',
205
        'uv_fs_fchown',
206
        'uv_fs_link',
207
        'uv_fs_symlink',
208
        'uv_fs_readlink',
209
        'uv_fs_stat',
210
        'uv_fs_lstat',
211
        'uv_fs_fstat',
212
        'uv_fs_readdir',
213
        'uv_fs_sendfile',
214
        'uv_fs_event_init',
215
        'uv_tty_init',
216
        'uv_tty_get_winsize',
217
        'uv_tty_set_mode',
218
        'uv_tty_reset_mode',
219
        'uv_tcp_getsockname',
220
        'uv_tcp_getpeername',
221
        'uv_udp_getsockname',
222
        'uv_resident_set_memory',
223
        'uv_ip4_name',
224
        'uv_ip6_name',
225
        'uv_poll_init',
226
        'uv_poll_start',
227
        'uv_poll_stop',
228
        'uv_fs_poll_init',
229
        'uv_fs_poll_start',
230
        'uv_fs_poll_stop',
231
        'uv_stop',
232
        'uv_signal_stop',
233
234
        // https://github.com/JetBrains/phpstorm-stubs/pull/594
235
        'parallel\bootstrap',
236
        'parallel\run',
237
238
        // https://youtrack.jetbrains.com/issue/WI-47038
239
        'pcov\collect',
240
        'pcov\start',
241
        'pcov\stop',
242
        'pcov\clear',
243
        'pcov\waiting',
244
        'pcov\memory',
245
    ];
246
247
    private const MISSING_CONSTANTS = [
248
        'STDIN',
249
        'STDOUT',
250
        'STDERR',
251
252
        // https://youtrack.jetbrains.com/issue/WI-47038
253
        'pcov\all',
254
        'pcov\inclusive',
255
        'pcov\exclusive',
256
    ];
257
258
    private static $CLASSES;
259
260
    private static $FUNCTIONS;
261
262
    private static $CONSTANTS;
263
264
    /**
265
     * @param array<string,string>|null $symbols
266
     * @param array<string,string>      $source
267
     * @param string[]                  $missingSymbols
268
     */
269
    private static function initSymbolList(?array &$symbols, array $source, array $missingSymbols): void
270
    {
271
        if (null !== $symbols) {
0 ignored issues
show
introduced by
The condition null !== $symbols is always true.
Loading history...
272
            return;
273
        }
274
275
        $symbols = array_fill_keys(
276
            array_merge(
277
                array_keys($source),
278
                $missingSymbols
279
            ),
280
            true
281
        );
282
    }
283
284
    public function __construct()
285
    {
286
        self::initSymbolList(self::$CLASSES, PhpStormStubsMap::CLASSES, self::MISSING_CLASSES);
287
        self::initSymbolList(self::$FUNCTIONS, PhpStormStubsMap::FUNCTIONS, self::MISSING_FUNCTIONS);
288
        self::initSymbolList(self::$CONSTANTS, PhpStormStubsMap::CONSTANTS, self::MISSING_CONSTANTS);
289
    }
290
291
    public function isClassInternal(string $name): bool
292
    {
293
        return isset(self::$CLASSES[$name]);
294
    }
295
296
    public function isFunctionInternal(string $name): bool
297
    {
298
        return isset(self::$FUNCTIONS[$name]);
299
    }
300
301
    public function isConstantInternal(string $name): bool
302
    {
303
        return isset(self::$CONSTANTS[$name]);
304
    }
305
}
306