Completed
Push — master ( 0aa69f...1f2f47 )
by Hannes
04:03
created

Parser::parseANNOTATION_GROUP()   D

Complexity

Conditions 12
Paths 177

Size

Total Lines 82
Code Lines 45

Duplication

Lines 25
Ratio 30.49 %

Importance

Changes 0
Metric Value
dl 25
loc 82
rs 4.6933
c 0
b 0
f 0
cc 12
eloc 45
nc 177
nop 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace hanneskod\readmetester;
4
5
class Parser
6
{
7
    protected $string;
8
    protected $position;
9
    protected $value;
10
    protected $cache;
11
    protected $cut;
12
    protected $errors;
13
    protected $warnings;
14
15
    protected function parseFILE()
16
    {
17
        $_position = $this->position;
18
19
        if (isset($this->cache['FILE'][$_position])) {
20
            $_success = $this->cache['FILE'][$_position]['success'];
21
            $this->position = $this->cache['FILE'][$_position]['position'];
22
            $this->value = $this->cache['FILE'][$_position]['value'];
23
24
            return $_success;
25
        }
26
27
        $_value9 = array();
28
29
        $_value4 = array();
30
        $_cut5 = $this->cut;
31
32
        while (true) {
33
            $_position3 = $this->position;
34
35
            $this->cut = false;
36
            $_position1 = $this->position;
37
            $_cut2 = $this->cut;
38
39
            $this->cut = false;
40
            $_success = $this->parseEXAMPLE();
41
42
            if (!$_success && !$this->cut) {
43
                $this->position = $_position1;
44
45
                $_success = $this->parseVOID_LINE();
46
            }
47
48
            $this->cut = $_cut2;
49
50
            if (!$_success) {
51
                break;
52
            }
53
54
            $_value4[] = $this->value;
55
        }
56
57
        if (!$this->cut) {
58
            $_success = true;
59
            $this->position = $_position3;
0 ignored issues
show
Bug introduced by
The variable $_position3 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
60
            $this->value = $_value4;
61
        }
62
63
        $this->cut = $_cut5;
64
65
        if ($_success) {
0 ignored issues
show
Bug introduced by
The variable $_success does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
66
            $examples = $this->value;
67
        }
68
69
        if ($_success) {
70
            $_value9[] = $this->value;
71
72
            $_value7 = array();
73
            $_cut8 = $this->cut;
74
75
            while (true) {
76
                $_position6 = $this->position;
77
78
                $this->cut = false;
79
                if ($this->position < strlen($this->string)) {
80
                    $_success = true;
81
                    $this->value = substr($this->string, $this->position, 1);
82
                    $this->position += 1;
83
                } else {
84
                    $_success = false;
85
                }
86
87
                if (!$_success) {
88
                    break;
89
                }
90
91
                $_value7[] = $this->value;
92
            }
93
94
            if (!$this->cut) {
95
                $_success = true;
96
                $this->position = $_position6;
0 ignored issues
show
Bug introduced by
The variable $_position6 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
97
                $this->value = $_value7;
98
            }
99
100
            $this->cut = $_cut8;
101
        }
102
103
        if ($_success) {
104
            $_value9[] = $this->value;
105
106
            $this->value = $_value9;
107
        }
108
109
        if ($_success) {
110
            $this->value = call_user_func(function () use (&$examples) {
111
                return array_values(array_filter($examples));
112
            });
113
        }
114
115
        $this->cache['FILE'][$_position] = array(
116
            'success' => $_success,
117
            'position' => $this->position,
118
            'value' => $this->value
119
        );
120
121
        if (!$_success) {
122
            $this->report($_position, 'FILE');
123
        }
124
125
        return $_success;
126
    }
127
128
    protected function parseVOID_LINE()
129
    {
130
        $_position = $this->position;
131
132
        if (isset($this->cache['VOID_LINE'][$_position])) {
133
            $_success = $this->cache['VOID_LINE'][$_position]['success'];
134
            $this->position = $this->cache['VOID_LINE'][$_position]['position'];
135
            $this->value = $this->cache['VOID_LINE'][$_position]['value'];
136
137
            return $_success;
138
        }
139
140
        $_value16 = array();
141
142
        $_value14 = array();
143
        $_cut15 = $this->cut;
144
145 View Code Duplication
        while (true) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
146
            $_position13 = $this->position;
147
148
            $this->cut = false;
149
            $_value12 = array();
150
151
            $_position10 = $this->position;
152
            $_cut11 = $this->cut;
153
154
            $this->cut = false;
155
            $_success = $this->parseEOL();
156
157
            if (!$_success) {
158
                $_success = true;
159
                $this->value = null;
160
            } else {
161
                $_success = false;
162
            }
163
164
            $this->position = $_position10;
165
            $this->cut = $_cut11;
166
167
            if ($_success) {
168
                $_value12[] = $this->value;
169
170
                if ($this->position < strlen($this->string)) {
171
                    $_success = true;
172
                    $this->value = substr($this->string, $this->position, 1);
173
                    $this->position += 1;
174
                } else {
175
                    $_success = false;
176
                }
177
            }
178
179
            if ($_success) {
180
                $_value12[] = $this->value;
181
182
                $this->value = $_value12;
183
            }
184
185
            if (!$_success) {
186
                break;
187
            }
188
189
            $_value14[] = $this->value;
190
        }
191
192
        if (!$this->cut) {
193
            $_success = true;
194
            $this->position = $_position13;
0 ignored issues
show
Bug introduced by
The variable $_position13 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
195
            $this->value = $_value14;
196
        }
197
198
        $this->cut = $_cut15;
199
200
        if ($_success) {
0 ignored issues
show
Bug introduced by
The variable $_success does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
201
            $_value16[] = $this->value;
202
203
            $_success = $this->parseEOL();
204
        }
205
206
        if ($_success) {
207
            $_value16[] = $this->value;
208
209
            $this->value = $_value16;
210
        }
211
212
        if ($_success) {
213
            $this->value = call_user_func(function () {
214
                return '';
215
            });
216
        }
217
218
        $this->cache['VOID_LINE'][$_position] = array(
219
            'success' => $_success,
220
            'position' => $this->position,
221
            'value' => $this->value
222
        );
223
224
        if (!$_success) {
225
            $this->report($_position, 'VOID_LINE');
226
        }
227
228
        return $_success;
229
    }
230
231
    protected function parseEXAMPLE()
232
    {
233
        $_position = $this->position;
234
235
        if (isset($this->cache['EXAMPLE'][$_position])) {
236
            $_success = $this->cache['EXAMPLE'][$_position]['success'];
237
            $this->position = $this->cache['EXAMPLE'][$_position]['position'];
238
            $this->value = $this->cache['EXAMPLE'][$_position]['value'];
239
240
            return $_success;
241
        }
242
243
        $_value19 = array();
244
245
        $_position17 = $this->position;
246
        $_cut18 = $this->cut;
247
248
        $this->cut = false;
249
        $_success = $this->parseANNOTATIONS();
250
251
        if (!$_success && !$this->cut) {
252
            $_success = true;
253
            $this->position = $_position17;
254
            $this->value = null;
255
        }
256
257
        $this->cut = $_cut18;
258
259
        if ($_success) {
260
            $annotations = $this->value;
261
        }
262
263
        if ($_success) {
264
            $_value19[] = $this->value;
265
266
            $_success = $this->parseCODE();
267
268
            if ($_success) {
269
                $code = $this->value;
270
            }
271
        }
272
273
        if ($_success) {
274
            $_value19[] = $this->value;
275
276
            $this->value = $_value19;
277
        }
278
279 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
280
            $this->value = call_user_func(function () use (&$annotations, &$code) {
281
                return ['annotations' => (array)$annotations, 'code' => $code];
282
            });
283
        }
284
285
        $this->cache['EXAMPLE'][$_position] = array(
286
            'success' => $_success,
287
            'position' => $this->position,
288
            'value' => $this->value
289
        );
290
291
        if (!$_success) {
292
            $this->report($_position, 'EXAMPLE');
293
        }
294
295
        return $_success;
296
    }
297
298
    protected function parseANNOTATIONS()
299
    {
300
        $_position = $this->position;
301
302
        if (isset($this->cache['ANNOTATIONS'][$_position])) {
303
            $_success = $this->cache['ANNOTATIONS'][$_position]['success'];
304
            $this->position = $this->cache['ANNOTATIONS'][$_position]['position'];
305
            $this->value = $this->cache['ANNOTATIONS'][$_position]['value'];
306
307
            return $_success;
308
        }
309
310
        $_success = $this->parseANNOTATION_GROUP();
311
312 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
313
            $_value21 = array($this->value);
314
            $_cut22 = $this->cut;
315
316
            while (true) {
317
                $_position20 = $this->position;
318
319
                $this->cut = false;
320
                $_success = $this->parseANNOTATION_GROUP();
321
322
                if (!$_success) {
323
                    break;
324
                }
325
326
                $_value21[] = $this->value;
327
            }
328
329
            if (!$this->cut) {
330
                $_success = true;
331
                $this->position = $_position20;
0 ignored issues
show
Bug introduced by
The variable $_position20 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
332
                $this->value = $_value21;
333
            }
334
335
            $this->cut = $_cut22;
336
        }
337
338
        if ($_success) {
339
            $groups = $this->value;
340
        }
341
342
        if ($_success) {
343
            $this->value = call_user_func(function () use (&$groups) {
344
                return call_user_func_array('array_merge', $groups);
345
            });
346
        }
347
348
        $this->cache['ANNOTATIONS'][$_position] = array(
349
            'success' => $_success,
350
            'position' => $this->position,
351
            'value' => $this->value
352
        );
353
354
        if (!$_success) {
355
            $this->report($_position, 'ANNOTATIONS');
356
        }
357
358
        return $_success;
359
    }
360
361
    protected function parseANNOTATION_GROUP()
362
    {
363
        $_position = $this->position;
364
365
        if (isset($this->cache['ANNOTATION_GROUP'][$_position])) {
366
            $_success = $this->cache['ANNOTATION_GROUP'][$_position]['success'];
367
            $this->position = $this->cache['ANNOTATION_GROUP'][$_position]['position'];
368
            $this->value = $this->cache['ANNOTATION_GROUP'][$_position]['value'];
369
370
            return $_success;
371
        }
372
373
        $_value26 = array();
374
375
        $_success = $this->parseANNOTATION_GROUP_START();
376
377
        if ($_success) {
378
            $_value26[] = $this->value;
379
380
            $_success = $this->parseANNOTATION();
381
382 View Code Duplication
            if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
383
                $_value24 = array($this->value);
384
                $_cut25 = $this->cut;
385
386
                while (true) {
387
                    $_position23 = $this->position;
388
389
                    $this->cut = false;
390
                    $_success = $this->parseANNOTATION();
391
392
                    if (!$_success) {
393
                        break;
394
                    }
395
396
                    $_value24[] = $this->value;
397
                }
398
399
                if (!$this->cut) {
400
                    $_success = true;
401
                    $this->position = $_position23;
0 ignored issues
show
Bug introduced by
The variable $_position23 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
402
                    $this->value = $_value24;
403
                }
404
405
                $this->cut = $_cut25;
406
            }
407
408
            if ($_success) {
409
                $annotations = $this->value;
410
            }
411
        }
412
413
        if ($_success) {
414
            $_value26[] = $this->value;
415
416
            $_success = $this->parseANNOTATIONS_GROUP_END();
417
        }
418
419
        if ($_success) {
420
            $_value26[] = $this->value;
421
422
            $this->value = $_value26;
423
        }
424
425
        if ($_success) {
426
            $this->value = call_user_func(function () use (&$annotations) {
427
                return $annotations;
428
            });
429
        }
430
431
        $this->cache['ANNOTATION_GROUP'][$_position] = array(
432
            'success' => $_success,
433
            'position' => $this->position,
434
            'value' => $this->value
435
        );
436
437
        if (!$_success) {
438
            $this->report($_position, 'ANNOTATION_GROUP');
439
        }
440
441
        return $_success;
442
    }
443
444
    protected function parseANNOTATION_GROUP_START()
445
    {
446
        $_position = $this->position;
447
448
        if (isset($this->cache['ANNOTATION_GROUP_START'][$_position])) {
449
            $_success = $this->cache['ANNOTATION_GROUP_START'][$_position]['success'];
450
            $this->position = $this->cache['ANNOTATION_GROUP_START'][$_position]['position'];
451
            $this->value = $this->cache['ANNOTATION_GROUP_START'][$_position]['value'];
452
453
            return $_success;
454
        }
455
456
        $_value31 = array();
457
458
        $_success = $this->parse_();
459
460 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
461
            $_value31[] = $this->value;
462
463
            if (substr($this->string, $this->position, strlen('<!--')) === '<!--') {
464
                $_success = true;
465
                $this->value = substr($this->string, $this->position, strlen('<!--'));
466
                $this->position += strlen('<!--');
467
            } else {
468
                $_success = false;
469
470
                $this->report($this->position, '\'<!--\'');
471
            }
472
        }
473
474 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
475
            $_value31[] = $this->value;
476
477
            $_position27 = $this->position;
478
            $_cut28 = $this->cut;
479
480
            $this->cut = false;
481
            if (substr($this->string, $this->position, strlen('-')) === '-') {
482
                $_success = true;
483
                $this->value = substr($this->string, $this->position, strlen('-'));
484
                $this->position += strlen('-');
485
            } else {
486
                $_success = false;
487
488
                $this->report($this->position, '\'-\'');
489
            }
490
491
            if (!$_success && !$this->cut) {
492
                $_success = true;
493
                $this->position = $_position27;
494
                $this->value = null;
495
            }
496
497
            $this->cut = $_cut28;
498
        }
499
500 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
501
            $_value31[] = $this->value;
502
503
            $_position29 = $this->position;
504
            $_cut30 = $this->cut;
505
506
            $this->cut = false;
507
            $_success = $this->parseEOL();
508
509
            if (!$_success && !$this->cut) {
510
                $_success = true;
511
                $this->position = $_position29;
512
                $this->value = null;
513
            }
514
515
            $this->cut = $_cut30;
516
        }
517
518
        if ($_success) {
519
            $_value31[] = $this->value;
520
521
            $this->value = $_value31;
522
        }
523
524
        $this->cache['ANNOTATION_GROUP_START'][$_position] = array(
525
            'success' => $_success,
526
            'position' => $this->position,
527
            'value' => $this->value
528
        );
529
530
        if (!$_success) {
531
            $this->report($_position, 'ANNOTATION_GROUP_START');
532
        }
533
534
        return $_success;
535
    }
536
537
    protected function parseANNOTATIONS_GROUP_END()
538
    {
539
        $_position = $this->position;
540
541
        if (isset($this->cache['ANNOTATIONS_GROUP_END'][$_position])) {
542
            $_success = $this->cache['ANNOTATIONS_GROUP_END'][$_position]['success'];
543
            $this->position = $this->cache['ANNOTATIONS_GROUP_END'][$_position]['position'];
544
            $this->value = $this->cache['ANNOTATIONS_GROUP_END'][$_position]['value'];
545
546
            return $_success;
547
        }
548
549
        $_value34 = array();
550
551
        $_success = $this->parse_();
552
553 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
554
            $_value34[] = $this->value;
555
556
            if (substr($this->string, $this->position, strlen('-->')) === '-->') {
557
                $_success = true;
558
                $this->value = substr($this->string, $this->position, strlen('-->'));
559
                $this->position += strlen('-->');
560
            } else {
561
                $_success = false;
562
563
                $this->report($this->position, '\'-->\'');
564
            }
565
        }
566
567 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
568
            $_value34[] = $this->value;
569
570
            $_position32 = $this->position;
571
            $_cut33 = $this->cut;
572
573
            $this->cut = false;
574
            $_success = $this->parseEOL();
575
576
            if (!$_success && !$this->cut) {
577
                $_success = true;
578
                $this->position = $_position32;
579
                $this->value = null;
580
            }
581
582
            $this->cut = $_cut33;
583
        }
584
585
        if ($_success) {
586
            $_value34[] = $this->value;
587
588
            $this->value = $_value34;
589
        }
590
591
        $this->cache['ANNOTATIONS_GROUP_END'][$_position] = array(
592
            'success' => $_success,
593
            'position' => $this->position,
594
            'value' => $this->value
595
        );
596
597
        if (!$_success) {
598
            $this->report($_position, 'ANNOTATIONS_GROUP_END');
599
        }
600
601
        return $_success;
602
    }
603
604
    protected function parseANNOTATION()
605
    {
606
        $_position = $this->position;
607
608
        if (isset($this->cache['ANNOTATION'][$_position])) {
609
            $_success = $this->cache['ANNOTATION'][$_position]['success'];
610
            $this->position = $this->cache['ANNOTATION'][$_position]['position'];
611
            $this->value = $this->cache['ANNOTATION'][$_position]['value'];
612
613
            return $_success;
614
        }
615
616
        $_value40 = array();
617
618
        $_success = $this->parse_();
619
620 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
621
            $_value40[] = $this->value;
622
623
            if (substr($this->string, $this->position, strlen('@')) === '@') {
624
                $_success = true;
625
                $this->value = substr($this->string, $this->position, strlen('@'));
626
                $this->position += strlen('@');
627
            } else {
628
                $_success = false;
629
630
                $this->report($this->position, '\'@\'');
631
            }
632
        }
633
634
        if ($_success) {
635
            $_value40[] = $this->value;
636
637
            $_success = $this->parseSTRING();
638
639
            if ($_success) {
640
                $name = $this->value;
641
            }
642
        }
643
644
        if ($_success) {
645
            $_value40[] = $this->value;
646
647
            $_value36 = array();
648
            $_cut37 = $this->cut;
649
650
            while (true) {
651
                $_position35 = $this->position;
652
653
                $this->cut = false;
654
                $_success = $this->parseSTRING();
655
656
                if (!$_success) {
657
                    break;
658
                }
659
660
                $_value36[] = $this->value;
661
            }
662
663
            if (!$this->cut) {
664
                $_success = true;
665
                $this->position = $_position35;
0 ignored issues
show
Bug introduced by
The variable $_position35 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
666
                $this->value = $_value36;
667
            }
668
669
            $this->cut = $_cut37;
670
671
            if ($_success) {
672
                $args = $this->value;
673
            }
674
        }
675
676 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
677
            $_value40[] = $this->value;
678
679
            $_position38 = $this->position;
680
            $_cut39 = $this->cut;
681
682
            $this->cut = false;
683
            $_success = $this->parseEOL();
684
685
            if (!$_success && !$this->cut) {
686
                $_success = true;
687
                $this->position = $_position38;
688
                $this->value = null;
689
            }
690
691
            $this->cut = $_cut39;
692
        }
693
694
        if ($_success) {
695
            $_value40[] = $this->value;
696
697
            $this->value = $_value40;
698
        }
699
700 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
701
            $this->value = call_user_func(function () use (&$name, &$args) {
702
                return [$name, $args];
703
            });
704
        }
705
706
        $this->cache['ANNOTATION'][$_position] = array(
707
            'success' => $_success,
708
            'position' => $this->position,
709
            'value' => $this->value
710
        );
711
712
        if (!$_success) {
713
            $this->report($_position, 'ANNOTATION');
714
        }
715
716
        return $_success;
717
    }
718
719
    protected function parseSTRING()
720
    {
721
        $_position = $this->position;
722
723
        if (isset($this->cache['STRING'][$_position])) {
724
            $_success = $this->cache['STRING'][$_position]['success'];
725
            $this->position = $this->cache['STRING'][$_position]['position'];
726
            $this->value = $this->cache['STRING'][$_position]['value'];
727
728
            return $_success;
729
        }
730
731
        $_value43 = array();
732
733
        $_success = $this->parse_();
734
735
        if ($_success) {
736
            $_value43[] = $this->value;
737
738
            $_position41 = $this->position;
739
            $_cut42 = $this->cut;
740
741
            $this->cut = false;
742
            $_success = $this->parseRAW_STRING();
743
744
            if (!$_success && !$this->cut) {
745
                $this->position = $_position41;
746
747
                $_success = $this->parseQUOTED_STRING();
748
            }
749
750
            if (!$_success && !$this->cut) {
751
                $this->position = $_position41;
752
753
                $_success = $this->parseEMPTY_STRING();
754
            }
755
756
            $this->cut = $_cut42;
757
758
            if ($_success) {
759
                $string = $this->value;
760
            }
761
        }
762
763
        if ($_success) {
764
            $_value43[] = $this->value;
765
766
            $_success = $this->parse_();
767
        }
768
769
        if ($_success) {
770
            $_value43[] = $this->value;
771
772
            $this->value = $_value43;
773
        }
774
775
        if ($_success) {
776
            $this->value = call_user_func(function () use (&$string) {
777
                return $string;
778
            });
779
        }
780
781
        $this->cache['STRING'][$_position] = array(
782
            'success' => $_success,
783
            'position' => $this->position,
784
            'value' => $this->value
785
        );
786
787
        if (!$_success) {
788
            $this->report($_position, 'STRING');
789
        }
790
791
        return $_success;
792
    }
793
794 View Code Duplication
    protected function parseEMPTY_STRING()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
795
    {
796
        $_position = $this->position;
797
798
        if (isset($this->cache['EMPTY_STRING'][$_position])) {
799
            $_success = $this->cache['EMPTY_STRING'][$_position]['success'];
800
            $this->position = $this->cache['EMPTY_STRING'][$_position]['position'];
801
            $this->value = $this->cache['EMPTY_STRING'][$_position]['value'];
802
803
            return $_success;
804
        }
805
806
        if (substr($this->string, $this->position, strlen('""')) === '""') {
807
            $_success = true;
808
            $this->value = substr($this->string, $this->position, strlen('""'));
809
            $this->position += strlen('""');
810
        } else {
811
            $_success = false;
812
813
            $this->report($this->position, '\'""\'');
814
        }
815
816
        if ($_success) {
817
            $this->value = call_user_func(function () {
818
                return '';
819
            });
820
        }
821
822
        $this->cache['EMPTY_STRING'][$_position] = array(
823
            'success' => $_success,
824
            'position' => $this->position,
825
            'value' => $this->value
826
        );
827
828
        if (!$_success) {
829
            $this->report($_position, 'EMPTY_STRING');
830
        }
831
832
        return $_success;
833
    }
834
835
    protected function parseQUOTED_STRING()
836
    {
837
        $_position = $this->position;
838
839
        if (isset($this->cache['QUOTED_STRING'][$_position])) {
840
            $_success = $this->cache['QUOTED_STRING'][$_position]['success'];
841
            $this->position = $this->cache['QUOTED_STRING'][$_position]['position'];
842
            $this->value = $this->cache['QUOTED_STRING'][$_position]['value'];
843
844
            return $_success;
845
        }
846
847
        $_value49 = array();
848
849
        if (substr($this->string, $this->position, strlen('"')) === '"') {
850
            $_success = true;
851
            $this->value = substr($this->string, $this->position, strlen('"'));
852
            $this->position += strlen('"');
853
        } else {
854
            $_success = false;
855
856
            $this->report($this->position, '\'"\'');
857
        }
858
859
        if ($_success) {
860
            $_value49[] = $this->value;
861
862
            $_value47 = array();
863
            $_cut48 = $this->cut;
864
865
            while (true) {
866
                $_position46 = $this->position;
867
868
                $this->cut = false;
869
                $_position44 = $this->position;
870
                $_cut45 = $this->cut;
871
872
                $this->cut = false;
873
                $_success = $this->parseESCAPED_QUOTE();
874
875 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
876
                    $this->position = $_position44;
877
878
                    if (substr($this->string, $this->position, strlen(' ')) === ' ') {
879
                        $_success = true;
880
                        $this->value = substr($this->string, $this->position, strlen(' '));
881
                        $this->position += strlen(' ');
882
                    } else {
883
                        $_success = false;
884
885
                        $this->report($this->position, '\' \'');
886
                    }
887
                }
888
889
                if (!$_success && !$this->cut) {
890
                    $this->position = $_position44;
891
892
                    $_success = $this->parseRAW_STRING();
893
                }
894
895
                $this->cut = $_cut45;
896
897
                if (!$_success) {
898
                    break;
899
                }
900
901
                $_value47[] = $this->value;
902
            }
903
904
            if (!$this->cut) {
905
                $_success = true;
906
                $this->position = $_position46;
0 ignored issues
show
Bug introduced by
The variable $_position46 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
907
                $this->value = $_value47;
908
            }
909
910
            $this->cut = $_cut48;
911
912
            if ($_success) {
913
                $string = $this->value;
914
            }
915
        }
916
917 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
918
            $_value49[] = $this->value;
919
920
            if (substr($this->string, $this->position, strlen('"')) === '"') {
921
                $_success = true;
922
                $this->value = substr($this->string, $this->position, strlen('"'));
923
                $this->position += strlen('"');
924
            } else {
925
                $_success = false;
926
927
                $this->report($this->position, '\'"\'');
928
            }
929
        }
930
931
        if ($_success) {
932
            $_value49[] = $this->value;
933
934
            $this->value = $_value49;
935
        }
936
937
        if ($_success) {
938
            $this->value = call_user_func(function () use (&$string) {
939
                return implode($string);
940
            });
941
        }
942
943
        $this->cache['QUOTED_STRING'][$_position] = array(
944
            'success' => $_success,
945
            'position' => $this->position,
946
            'value' => $this->value
947
        );
948
949
        if (!$_success) {
950
            $this->report($_position, 'QUOTED_STRING');
951
        }
952
953
        return $_success;
954
    }
955
956 View Code Duplication
    protected function parseESCAPED_QUOTE()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
957
    {
958
        $_position = $this->position;
959
960
        if (isset($this->cache['ESCAPED_QUOTE'][$_position])) {
961
            $_success = $this->cache['ESCAPED_QUOTE'][$_position]['success'];
962
            $this->position = $this->cache['ESCAPED_QUOTE'][$_position]['position'];
963
            $this->value = $this->cache['ESCAPED_QUOTE'][$_position]['value'];
964
965
            return $_success;
966
        }
967
968
        if (substr($this->string, $this->position, strlen('\"')) === '\"') {
969
            $_success = true;
970
            $this->value = substr($this->string, $this->position, strlen('\"'));
971
            $this->position += strlen('\"');
972
        } else {
973
            $_success = false;
974
975
            $this->report($this->position, '\'\\"\'');
976
        }
977
978
        if ($_success) {
979
            $this->value = call_user_func(function () {
980
                return '"';
981
            });
982
        }
983
984
        $this->cache['ESCAPED_QUOTE'][$_position] = array(
985
            'success' => $_success,
986
            'position' => $this->position,
987
            'value' => $this->value
988
        );
989
990
        if (!$_success) {
991
            $this->report($_position, 'ESCAPED_QUOTE');
992
        }
993
994
        return $_success;
995
    }
996
997
    protected function parseRAW_STRING()
998
    {
999
        $_position = $this->position;
1000
1001
        if (isset($this->cache['RAW_STRING'][$_position])) {
1002
            $_success = $this->cache['RAW_STRING'][$_position]['success'];
1003
            $this->position = $this->cache['RAW_STRING'][$_position]['position'];
1004
            $this->value = $this->cache['RAW_STRING'][$_position]['value'];
1005
1006
            return $_success;
1007
        }
1008
1009
        $_position58 = $this->position;
1010
1011
        $_value54 = array();
1012
1013
        $_position52 = $this->position;
1014
        $_cut53 = $this->cut;
1015
1016
        $this->cut = false;
1017
        $_position50 = $this->position;
1018
        $_cut51 = $this->cut;
1019
1020
        $this->cut = false;
1021
        if (substr($this->string, $this->position, strlen(' ')) === ' ') {
1022
            $_success = true;
1023
            $this->value = substr($this->string, $this->position, strlen(' '));
1024
            $this->position += strlen(' ');
1025
        } else {
1026
            $_success = false;
1027
1028
            $this->report($this->position, '\' \'');
1029
        }
1030
1031 View Code Duplication
        if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1032
            $this->position = $_position50;
1033
1034
            if (substr($this->string, $this->position, strlen("\r")) === "\r") {
1035
                $_success = true;
1036
                $this->value = substr($this->string, $this->position, strlen("\r"));
1037
                $this->position += strlen("\r");
1038
            } else {
1039
                $_success = false;
1040
1041
                $this->report($this->position, '"\\r"');
1042
            }
1043
        }
1044
1045 View Code Duplication
        if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1046
            $this->position = $_position50;
1047
1048
            if (substr($this->string, $this->position, strlen("\n")) === "\n") {
1049
                $_success = true;
1050
                $this->value = substr($this->string, $this->position, strlen("\n"));
1051
                $this->position += strlen("\n");
1052
            } else {
1053
                $_success = false;
1054
1055
                $this->report($this->position, '"\\n"');
1056
            }
1057
        }
1058
1059 View Code Duplication
        if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1060
            $this->position = $_position50;
1061
1062
            if (substr($this->string, $this->position, strlen("\t")) === "\t") {
1063
                $_success = true;
1064
                $this->value = substr($this->string, $this->position, strlen("\t"));
1065
                $this->position += strlen("\t");
1066
            } else {
1067
                $_success = false;
1068
1069
                $this->report($this->position, '"\\t"');
1070
            }
1071
        }
1072
1073 View Code Duplication
        if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1074
            $this->position = $_position50;
1075
1076
            if (substr($this->string, $this->position, strlen('-->')) === '-->') {
1077
                $_success = true;
1078
                $this->value = substr($this->string, $this->position, strlen('-->'));
1079
                $this->position += strlen('-->');
1080
            } else {
1081
                $_success = false;
1082
1083
                $this->report($this->position, '\'-->\'');
1084
            }
1085
        }
1086
1087 View Code Duplication
        if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1088
            $this->position = $_position50;
1089
1090
            if (substr($this->string, $this->position, strlen('"')) === '"') {
1091
                $_success = true;
1092
                $this->value = substr($this->string, $this->position, strlen('"'));
1093
                $this->position += strlen('"');
1094
            } else {
1095
                $_success = false;
1096
1097
                $this->report($this->position, '\'"\'');
1098
            }
1099
        }
1100
1101
        $this->cut = $_cut51;
1102
1103
        if (!$_success) {
1104
            $_success = true;
1105
            $this->value = null;
1106
        } else {
1107
            $_success = false;
1108
        }
1109
1110
        $this->position = $_position52;
1111
        $this->cut = $_cut53;
1112
1113
        if ($_success) {
1114
            $_value54[] = $this->value;
1115
1116
            if ($this->position < strlen($this->string)) {
1117
                $_success = true;
1118
                $this->value = substr($this->string, $this->position, 1);
1119
                $this->position += 1;
1120
            } else {
1121
                $_success = false;
1122
            }
1123
        }
1124
1125
        if ($_success) {
1126
            $_value54[] = $this->value;
1127
1128
            $this->value = $_value54;
1129
        }
1130
1131
        if ($_success) {
1132
            $_value56 = array($this->value);
1133
            $_cut57 = $this->cut;
1134
1135
            while (true) {
1136
                $_position55 = $this->position;
1137
1138
                $this->cut = false;
1139
                $_value54 = array();
1140
1141
                $_position52 = $this->position;
1142
                $_cut53 = $this->cut;
1143
1144
                $this->cut = false;
1145
                $_position50 = $this->position;
1146
                $_cut51 = $this->cut;
1147
1148
                $this->cut = false;
1149
                if (substr($this->string, $this->position, strlen(' ')) === ' ') {
1150
                    $_success = true;
1151
                    $this->value = substr($this->string, $this->position, strlen(' '));
1152
                    $this->position += strlen(' ');
1153
                } else {
1154
                    $_success = false;
1155
1156
                    $this->report($this->position, '\' \'');
1157
                }
1158
1159 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1160
                    $this->position = $_position50;
1161
1162
                    if (substr($this->string, $this->position, strlen("\r")) === "\r") {
1163
                        $_success = true;
1164
                        $this->value = substr($this->string, $this->position, strlen("\r"));
1165
                        $this->position += strlen("\r");
1166
                    } else {
1167
                        $_success = false;
1168
1169
                        $this->report($this->position, '"\\r"');
1170
                    }
1171
                }
1172
1173 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1174
                    $this->position = $_position50;
1175
1176
                    if (substr($this->string, $this->position, strlen("\n")) === "\n") {
1177
                        $_success = true;
1178
                        $this->value = substr($this->string, $this->position, strlen("\n"));
1179
                        $this->position += strlen("\n");
1180
                    } else {
1181
                        $_success = false;
1182
1183
                        $this->report($this->position, '"\\n"');
1184
                    }
1185
                }
1186
1187 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1188
                    $this->position = $_position50;
1189
1190
                    if (substr($this->string, $this->position, strlen("\t")) === "\t") {
1191
                        $_success = true;
1192
                        $this->value = substr($this->string, $this->position, strlen("\t"));
1193
                        $this->position += strlen("\t");
1194
                    } else {
1195
                        $_success = false;
1196
1197
                        $this->report($this->position, '"\\t"');
1198
                    }
1199
                }
1200
1201 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1202
                    $this->position = $_position50;
1203
1204
                    if (substr($this->string, $this->position, strlen('-->')) === '-->') {
1205
                        $_success = true;
1206
                        $this->value = substr($this->string, $this->position, strlen('-->'));
1207
                        $this->position += strlen('-->');
1208
                    } else {
1209
                        $_success = false;
1210
1211
                        $this->report($this->position, '\'-->\'');
1212
                    }
1213
                }
1214
1215 View Code Duplication
                if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1216
                    $this->position = $_position50;
1217
1218
                    if (substr($this->string, $this->position, strlen('"')) === '"') {
1219
                        $_success = true;
1220
                        $this->value = substr($this->string, $this->position, strlen('"'));
1221
                        $this->position += strlen('"');
1222
                    } else {
1223
                        $_success = false;
1224
1225
                        $this->report($this->position, '\'"\'');
1226
                    }
1227
                }
1228
1229
                $this->cut = $_cut51;
1230
1231
                if (!$_success) {
1232
                    $_success = true;
1233
                    $this->value = null;
1234
                } else {
1235
                    $_success = false;
1236
                }
1237
1238
                $this->position = $_position52;
1239
                $this->cut = $_cut53;
1240
1241
                if ($_success) {
1242
                    $_value54[] = $this->value;
1243
1244
                    if ($this->position < strlen($this->string)) {
1245
                        $_success = true;
1246
                        $this->value = substr($this->string, $this->position, 1);
1247
                        $this->position += 1;
1248
                    } else {
1249
                        $_success = false;
1250
                    }
1251
                }
1252
1253
                if ($_success) {
1254
                    $_value54[] = $this->value;
1255
1256
                    $this->value = $_value54;
1257
                }
1258
1259
                if (!$_success) {
1260
                    break;
1261
                }
1262
1263
                $_value56[] = $this->value;
1264
            }
1265
1266
            if (!$this->cut) {
1267
                $_success = true;
1268
                $this->position = $_position55;
0 ignored issues
show
Bug introduced by
The variable $_position55 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1269
                $this->value = $_value56;
1270
            }
1271
1272
            $this->cut = $_cut57;
1273
        }
1274
1275 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1276
            $this->value = strval(substr($this->string, $_position58, $this->position - $_position58));
1277
        }
1278
1279
        $this->cache['RAW_STRING'][$_position] = array(
1280
            'success' => $_success,
1281
            'position' => $this->position,
1282
            'value' => $this->value
1283
        );
1284
1285
        if (!$_success) {
1286
            $this->report($_position, 'RAW_STRING');
1287
        }
1288
1289
        return $_success;
1290
    }
1291
1292
    protected function parseCODE()
1293
    {
1294
        $_position = $this->position;
1295
1296
        if (isset($this->cache['CODE'][$_position])) {
1297
            $_success = $this->cache['CODE'][$_position]['success'];
1298
            $this->position = $this->cache['CODE'][$_position]['position'];
1299
            $this->value = $this->cache['CODE'][$_position]['value'];
1300
1301
            return $_success;
1302
        }
1303
1304
        $_value66 = array();
1305
1306
        $_success = $this->parseCODE_START();
1307
1308
        if ($_success) {
1309
            $_value66[] = $this->value;
1310
1311
            $_position65 = $this->position;
1312
1313
            $_value63 = array();
1314
            $_cut64 = $this->cut;
1315
1316 View Code Duplication
            while (true) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1317
                $_position62 = $this->position;
1318
1319
                $this->cut = false;
1320
                $_value61 = array();
1321
1322
                $_position59 = $this->position;
1323
                $_cut60 = $this->cut;
1324
1325
                $this->cut = false;
1326
                $_success = $this->parseCODE_END();
1327
1328
                if (!$_success) {
1329
                    $_success = true;
1330
                    $this->value = null;
1331
                } else {
1332
                    $_success = false;
1333
                }
1334
1335
                $this->position = $_position59;
1336
                $this->cut = $_cut60;
1337
1338
                if ($_success) {
1339
                    $_value61[] = $this->value;
1340
1341
                    if ($this->position < strlen($this->string)) {
1342
                        $_success = true;
1343
                        $this->value = substr($this->string, $this->position, 1);
1344
                        $this->position += 1;
1345
                    } else {
1346
                        $_success = false;
1347
                    }
1348
                }
1349
1350
                if ($_success) {
1351
                    $_value61[] = $this->value;
1352
1353
                    $this->value = $_value61;
1354
                }
1355
1356
                if (!$_success) {
1357
                    break;
1358
                }
1359
1360
                $_value63[] = $this->value;
1361
            }
1362
1363
            if (!$this->cut) {
1364
                $_success = true;
1365
                $this->position = $_position62;
0 ignored issues
show
Bug introduced by
The variable $_position62 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1366
                $this->value = $_value63;
1367
            }
1368
1369
            $this->cut = $_cut64;
1370
1371 View Code Duplication
            if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1372
                $this->value = strval(substr($this->string, $_position65, $this->position - $_position65));
1373
            }
1374
1375
            if ($_success) {
1376
                $code = $this->value;
1377
            }
1378
        }
1379
1380
        if ($_success) {
1381
            $_value66[] = $this->value;
1382
1383
            $_success = $this->parseCODE_END();
1384
        }
1385
1386
        if ($_success) {
1387
            $_value66[] = $this->value;
1388
1389
            $this->value = $_value66;
1390
        }
1391
1392
        if ($_success) {
1393
            $this->value = call_user_func(function () use (&$code) {
1394
                return $code;
1395
            });
1396
        }
1397
1398
        $this->cache['CODE'][$_position] = array(
1399
            'success' => $_success,
1400
            'position' => $this->position,
1401
            'value' => $this->value
1402
        );
1403
1404
        if (!$_success) {
1405
            $this->report($_position, 'CODE');
1406
        }
1407
1408
        return $_success;
1409
    }
1410
1411
    protected function parseCODE_START()
1412
    {
1413
        $_position = $this->position;
1414
1415
        if (isset($this->cache['CODE_START'][$_position])) {
1416
            $_success = $this->cache['CODE_START'][$_position]['success'];
1417
            $this->position = $this->cache['CODE_START'][$_position]['position'];
1418
            $this->value = $this->cache['CODE_START'][$_position]['value'];
1419
1420
            return $_success;
1421
        }
1422
1423
        $_value67 = array();
1424
1425
        if (strtolower(substr($this->string, $this->position, strlen('```php'))) === strtolower('```php')) {
1426
            $_success = true;
1427
            $this->value = substr($this->string, $this->position, strlen('```php'));
1428
            $this->position += strlen('```php');
1429
        } else {
1430
            $_success = false;
1431
1432
            $this->report($this->position, '\'```php\'');
1433
        }
1434
1435
        if ($_success) {
1436
            $_value67[] = $this->value;
1437
1438
            $_success = $this->parseEOL();
1439
        }
1440
1441
        if ($_success) {
1442
            $_value67[] = $this->value;
1443
1444
            $this->value = $_value67;
1445
        }
1446
1447
        $this->cache['CODE_START'][$_position] = array(
1448
            'success' => $_success,
1449
            'position' => $this->position,
1450
            'value' => $this->value
1451
        );
1452
1453
        if (!$_success) {
1454
            $this->report($_position, 'CODE_START');
1455
        }
1456
1457
        return $_success;
1458
    }
1459
1460
    protected function parseCODE_END()
1461
    {
1462
        $_position = $this->position;
1463
1464
        if (isset($this->cache['CODE_END'][$_position])) {
1465
            $_success = $this->cache['CODE_END'][$_position]['success'];
1466
            $this->position = $this->cache['CODE_END'][$_position]['position'];
1467
            $this->value = $this->cache['CODE_END'][$_position]['value'];
1468
1469
            return $_success;
1470
        }
1471
1472
        $_value70 = array();
1473
1474
        if (substr($this->string, $this->position, strlen('```')) === '```') {
1475
            $_success = true;
1476
            $this->value = substr($this->string, $this->position, strlen('```'));
1477
            $this->position += strlen('```');
1478
        } else {
1479
            $_success = false;
1480
1481
            $this->report($this->position, '\'```\'');
1482
        }
1483
1484
        if ($_success) {
1485
            $_value70[] = $this->value;
1486
1487
            $_position68 = $this->position;
1488
            $_cut69 = $this->cut;
1489
1490
            $this->cut = false;
1491
            $_success = $this->parseEOL();
1492
1493
            if (!$_success && !$this->cut) {
1494
                $this->position = $_position68;
1495
1496
                $_success = $this->parseEOF();
1497
            }
1498
1499
            $this->cut = $_cut69;
1500
        }
1501
1502
        if ($_success) {
1503
            $_value70[] = $this->value;
1504
1505
            $this->value = $_value70;
1506
        }
1507
1508
        $this->cache['CODE_END'][$_position] = array(
1509
            'success' => $_success,
1510
            'position' => $this->position,
1511
            'value' => $this->value
1512
        );
1513
1514
        if (!$_success) {
1515
            $this->report($_position, 'CODE_END');
1516
        }
1517
1518
        return $_success;
1519
    }
1520
1521
    protected function parseEOL()
1522
    {
1523
        $_position = $this->position;
1524
1525
        if (isset($this->cache['EOL'][$_position])) {
1526
            $_success = $this->cache['EOL'][$_position]['success'];
1527
            $this->position = $this->cache['EOL'][$_position]['position'];
1528
            $this->value = $this->cache['EOL'][$_position]['value'];
1529
1530
            return $_success;
1531
        }
1532
1533
        $_value73 = array();
1534
1535
        $_success = $this->parse_();
1536
1537 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1538
            $_value73[] = $this->value;
1539
1540
            $_position71 = $this->position;
1541
            $_cut72 = $this->cut;
1542
1543
            $this->cut = false;
1544
            if (substr($this->string, $this->position, strlen("\r")) === "\r") {
1545
                $_success = true;
1546
                $this->value = substr($this->string, $this->position, strlen("\r"));
1547
                $this->position += strlen("\r");
1548
            } else {
1549
                $_success = false;
1550
1551
                $this->report($this->position, '"\\r"');
1552
            }
1553
1554
            if (!$_success && !$this->cut) {
1555
                $_success = true;
1556
                $this->position = $_position71;
1557
                $this->value = null;
1558
            }
1559
1560
            $this->cut = $_cut72;
1561
        }
1562
1563 View Code Duplication
        if ($_success) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1564
            $_value73[] = $this->value;
1565
1566
            if (substr($this->string, $this->position, strlen("\n")) === "\n") {
1567
                $_success = true;
1568
                $this->value = substr($this->string, $this->position, strlen("\n"));
1569
                $this->position += strlen("\n");
1570
            } else {
1571
                $_success = false;
1572
1573
                $this->report($this->position, '"\\n"');
1574
            }
1575
        }
1576
1577
        if ($_success) {
1578
            $_value73[] = $this->value;
1579
1580
            $this->value = $_value73;
1581
        }
1582
1583
        $this->cache['EOL'][$_position] = array(
1584
            'success' => $_success,
1585
            'position' => $this->position,
1586
            'value' => $this->value
1587
        );
1588
1589
        if (!$_success) {
1590
            $this->report($_position, "END_OF_LINE");
1591
        }
1592
1593
        return $_success;
1594
    }
1595
1596
    protected function parseEOF()
1597
    {
1598
        $_position = $this->position;
1599
1600
        if (isset($this->cache['EOF'][$_position])) {
1601
            $_success = $this->cache['EOF'][$_position]['success'];
1602
            $this->position = $this->cache['EOF'][$_position]['position'];
1603
            $this->value = $this->cache['EOF'][$_position]['value'];
1604
1605
            return $_success;
1606
        }
1607
1608
        $_position74 = $this->position;
1609
        $_cut75 = $this->cut;
1610
1611
        $this->cut = false;
1612
        if ($this->position < strlen($this->string)) {
1613
            $_success = true;
1614
            $this->value = substr($this->string, $this->position, 1);
1615
            $this->position += 1;
1616
        } else {
1617
            $_success = false;
1618
        }
1619
1620
        if (!$_success) {
1621
            $_success = true;
1622
            $this->value = null;
1623
        } else {
1624
            $_success = false;
1625
        }
1626
1627
        $this->position = $_position74;
1628
        $this->cut = $_cut75;
1629
1630
        $this->cache['EOF'][$_position] = array(
1631
            'success' => $_success,
1632
            'position' => $this->position,
1633
            'value' => $this->value
1634
        );
1635
1636
        if (!$_success) {
1637
            $this->report($_position, "END_OF_FILE");
1638
        }
1639
1640
        return $_success;
1641
    }
1642
1643
    protected function parse_()
1644
    {
1645
        $_position = $this->position;
1646
1647
        if (isset($this->cache['_'][$_position])) {
1648
            $_success = $this->cache['_'][$_position]['success'];
1649
            $this->position = $this->cache['_'][$_position]['position'];
1650
            $this->value = $this->cache['_'][$_position]['value'];
1651
1652
            return $_success;
1653
        }
1654
1655
        $_value79 = array();
1656
        $_cut80 = $this->cut;
1657
1658
        while (true) {
1659
            $_position78 = $this->position;
1660
1661
            $this->cut = false;
1662
            $_position76 = $this->position;
1663
            $_cut77 = $this->cut;
1664
1665
            $this->cut = false;
1666
            if (substr($this->string, $this->position, strlen(" ")) === " ") {
1667
                $_success = true;
1668
                $this->value = substr($this->string, $this->position, strlen(" "));
1669
                $this->position += strlen(" ");
1670
            } else {
1671
                $_success = false;
1672
1673
                $this->report($this->position, '" "');
1674
            }
1675
1676 View Code Duplication
            if (!$_success && !$this->cut) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1677
                $this->position = $_position76;
1678
1679
                if (substr($this->string, $this->position, strlen("\t")) === "\t") {
1680
                    $_success = true;
1681
                    $this->value = substr($this->string, $this->position, strlen("\t"));
1682
                    $this->position += strlen("\t");
1683
                } else {
1684
                    $_success = false;
1685
1686
                    $this->report($this->position, '"\\t"');
1687
                }
1688
            }
1689
1690
            $this->cut = $_cut77;
1691
1692
            if (!$_success) {
1693
                break;
1694
            }
1695
1696
            $_value79[] = $this->value;
1697
        }
1698
1699
        if (!$this->cut) {
1700
            $_success = true;
1701
            $this->position = $_position78;
0 ignored issues
show
Bug introduced by
The variable $_position78 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1702
            $this->value = $_value79;
1703
        }
1704
1705
        $this->cut = $_cut80;
1706
1707
        $this->cache['_'][$_position] = array(
1708
            'success' => $_success,
0 ignored issues
show
Bug introduced by
The variable $_success does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
1709
            'position' => $this->position,
1710
            'value' => $this->value
1711
        );
1712
1713
        if (!$_success) {
1714
            $this->report($_position, '_');
1715
        }
1716
1717
        return $_success;
1718
    }
1719
1720
    private function line()
1721
    {
1722
        if (!empty($this->errors)) {
1723
            $positions = array_keys($this->errors);
1724
        } else {
1725
            $positions = array_keys($this->warnings);
1726
        }
1727
1728
        return count(explode("\n", substr($this->string, 0, max($positions))));
1729
    }
1730
1731
    private function rest()
1732
    {
1733
        return '"' . substr($this->string, $this->position) . '"';
1734
    }
1735
1736
    protected function report($position, $expecting)
1737
    {
1738
        if ($this->cut) {
1739
            $this->errors[$position][] = $expecting;
1740
        } else {
1741
            $this->warnings[$position][] = $expecting;
1742
        }
1743
    }
1744
1745
    private function expecting()
1746
    {
1747
        if (!empty($this->errors)) {
1748
            ksort($this->errors);
1749
1750
            return end($this->errors)[0];
1751
        }
1752
1753
        ksort($this->warnings);
1754
1755
        return implode(', ', end($this->warnings));
1756
    }
1757
1758
    public function parse($_string)
1759
    {
1760
        $this->string = $_string;
1761
        $this->position = 0;
1762
        $this->value = null;
1763
        $this->cache = array();
1764
        $this->cut = false;
1765
        $this->errors = array();
1766
        $this->warnings = array();
1767
1768
        $_success = $this->parseFILE();
1769
1770
        if ($_success && $this->position < strlen($this->string)) {
1771
            $_success = false;
1772
1773
            $this->report($this->position, "end of file");
1774
        }
1775
1776
        if (!$_success) {
1777
            throw new \InvalidArgumentException("Syntax error, expecting {$this->expecting()} on line {$this->line()}");
1778
        }
1779
1780
        return $this->value;
1781
    }
1782
}