SyntaxNormalizer   A
last analyzed

Complexity

Total Complexity 25

Size/Duplication

Total Lines 110
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
dl 0
loc 110
rs 10
c 0
b 0
f 0
wmc 25
lcom 1
cbo 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
F normalizeSyntax() 0 98 23
A removeSemi() 0 6 2
1
<?php
2
3
namespace Imanghafoori\LaravelMicroscope\Refactors;
4
5
use Imanghafoori\LaravelMicroscope\Analyzers\Ifs;
6
use Imanghafoori\LaravelMicroscope\Analyzers\TokenManager;
7
8
class SyntaxNormalizer
9
{
10
    public static $hasChange;
11
12
    public static function normalizeSyntax($tokens, $replace = false)
13
    {
14
        $ends = [T_ENDFOR, T_ENDIF, T_ENDFOREACH, T_ENDWHILE];
15
        $start = [T_FOR, T_IF, T_FOREACH, T_WHILE, T_ELSEIF];
16
        $i = 0;
17
        $refactoredTokens = [];
18
        $tCount = \count($tokens);
19
        $ifIf = [];
20
        $closing = $replace ? '}' : ['}', ''];
21
22
        $opening = function ($or = '') use ($replace) {
23
            return $replace ? '{' : ['{', $or];
24
        };
25
26
        self::$hasChange = false;
27
28
        while ($tCount > $i) {
29
            $t = $tokens[$i];
30
            if (\in_array($t[0], $ends)) {
31
                self::$hasChange = true;
32
                // replace the ruby-style syntax with C-style
33
                $refactoredTokens[] = $replace ? '}' : ['}', $t[1]];
34
                $replace && self::removeSemi($tokens, $i);
35
                $i++;
36
                continue;
37
            }
38
39
            if (\in_array($t[0], $start)) {
40
                // forward to end of parenthesis
41
                [, , $u] = Ifs::readCondition($tokens, $i);
0 ignored issues
show
Bug introduced by
The variable $u does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
42
                // read first char after the parenthesis
43
                [$next, $u] = TokenManager::getNextToken($tokens, $u);
0 ignored issues
show
Bug introduced by
The variable $next does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
44
                if ($next == ':') {
45
                    $tokens[$u] = $opening(':');
46
                    // Adds a closing curly brace "}" before elseif.
47
                    $t[0] == T_ELSEIF && $refactoredTokens[] = $closing;
48
                }
49
            }
50
51
            if ($t[0] == T_ELSE || $t[0] == T_IF) {
52
                if ($t[0] == T_ELSE) {
53
                    [$next_T, $next_I] = TokenManager::getNextToken($tokens, $i);
0 ignored issues
show
Bug introduced by
The variable $next_T does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
Bug introduced by
The variable $next_I does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
54
                } else {
55
                    [, , $u] = Ifs::readCondition($tokens, $i);
56
                    [$next_T, $next_I] = TokenManager::getNextToken($tokens, $u);
57
                }
58
59
                if (\in_array($next_T[0], [T_FOR, T_FOREACH, T_WHILE])) {
60
                    array_splice($tokens, $next_I, 0, [$opening()]);
61
                    $refactoredTokens[] = $t;
62
                    $i++;
63
                    [, , $u] = Ifs::readCondition($tokens, $next_I + 1);
64
                    [, $u] = TokenManager::getNextToken($tokens, $u);
65
                    [, $u] = TokenManager::readBody($tokens, $u);
66
                    array_splice($tokens, $u, 0, [$closing]);
67
68
                    // we update the count since the number of elements is changed.
69
                    $tCount = \count($tokens);
70
                    continue;
71
                } elseif ($next_T[0] !== T_IF && $next_T !== '{' && $next_T !== ':') {
72
                    /**
73
                     * in case if or else block is like this:
74
                     * if ($v) {
75
                     *    ...
76
                     * } else
77
                     *   $var = 0;.
78
                     */
79
                    $refactoredTokens[] = $t;
80
                    array_splice($tokens, $next_I - 1, 0, [$opening()]);
81
                    [, $endIndex] = TokenManager::forwardTo($tokens, $i, [';']);
0 ignored issues
show
Bug introduced by
The variable $endIndex does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
82
                    $NEXT = TokenManager::getNextToken($tokens, $endIndex);
83
                    if ($NEXT[0][0] == T_ELSE && $t[0] == T_ELSE) {
84
                        $ia = array_pop($ifIf);
85
                        array_splice($refactoredTokens, $ia, 0, [$opening()]);
86
                        array_splice($tokens, $endIndex + 2, 0, [$closing]);
87
                    }
88
                    array_splice($tokens, $endIndex + 2, 0, [$closing]);
89
                    $tCount = \count($tokens);
90
                    $i++;
91
                    continue;
92
                } elseif ($t[0] == T_IF && $next_T[0] === T_IF) {
93
                    $ifIf[] = $next_I;
94
                }
95
            }
96
97
            [$next, $u] = TokenManager::getNextToken($tokens, $i);
98
99
            if ($next == ':' && $t[0] == T_ELSE) {
100
                $tokens[$u] = $opening(':');
101
                $refactoredTokens[] = $closing;
102
            }
103
104
            $refactoredTokens[] = $t;
105
            $i++;
106
        }
107
108
        return $refactoredTokens;
109
    }
110
111
    private static function removeSemi(&$tokens, $i)
112
    {
113
        [$next, $u] = TokenManager::getNextToken($tokens, $i);
0 ignored issues
show
Bug introduced by
The variable $next does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
Bug introduced by
The variable $u does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
114
        // replaces ";" token with a neutral token.
115
        $next == ';' && $tokens[$u] = ['', ''];
116
    }
117
}
118