SymbolTranslationScheme::applyActions()   F
last analyzed

Complexity

Conditions 23
Paths 23

Size

Total Lines 159
Code Lines 102

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 23
eloc 102
c 1
b 0
f 1
nc 23
nop 2
dl 0
loc 159
rs 3.3333

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
declare(strict_types=1);
4
5
namespace Remorhaz\UniLex\RegExp\Grammar;
6
7
use Remorhaz\UniLex\AST\Tree;
8
use Remorhaz\UniLex\Exception;
9
use Remorhaz\UniLex\Parser\Production;
10
use Remorhaz\UniLex\RegExp\AST\NodeType;
11
12
class SymbolTranslationScheme
13
{
14
    private $tree;
15
16
    public function __construct(Tree $tree)
17
    {
18
        $this->tree = $tree;
19
    }
20
21
    /**
22
     * @param Production $production
23
     * @param int $symbolIndex
24
     * @throws Exception
25
     */
26
    public function applyActions(Production $production, int $symbolIndex): void
27
    {
28
        $header = $production->getHeaderShortcut();
29
        $symbols = $production->getSymbolListShortcut();
30
        $hash = "{$production->getHeader()->getSymbolId()}.{$production->getIndex()}.{$symbolIndex}";
31
        switch ($hash) {
32
            case SymbolType::NT_PARTS . ".0.1":
33
                // [SymbolType::NT_PART, SymbolType::NT_ALT_PARTS]
34
                // SymbolType::NT_ALT_PARTS
35
                $symbols[1]['i.alternative_node'] = $symbols[0]['s.alternative_node'];
36
                break;
37
38
            case SymbolType::NT_ALT_PARTS . ".0.1":
39
                // [SymbolType::NT_ALT_SEPARATOR, SymbolType::NT_PART, SymbolType::NT_ALT_PARTS_TAIL]
40
                // SymbolType::NT_PART
41
                $alternativesNode = $this
42
                    ->tree
43
                    ->createNode(NodeType::ALTERNATIVE)
44
                    ->addChild($this->tree->getNode($header['i.alternative_node']));
45
                $symbols[1]['i.alternatives_node'] = $alternativesNode->getId();
46
                break;
47
48
            case SymbolType::NT_ALT_PARTS . ".0.2":
49
                // SymbolType::NT_ALT_PARTS_TAIL
50
                $symbols[2]['i.alternatives_node'] = $symbols[1]['i.alternatives_node'];
51
                $symbols[2]['i.alternative_node'] = $symbols[1]['s.alternative_node'];
52
                break;
53
54
            case SymbolType::NT_ALT_PARTS_TAIL . ".0.1":
55
                // [SymbolType::NT_ALT_SEPARATOR, SymbolType::NT_PART, SymbolType::NT_ALT_PARTS_TAIL]
56
                // SymbolType::NT_PART
57
                $alternativesNode = $this
58
                    ->tree
59
                    ->getNode($header['i.alternatives_node'])
60
                    ->addChild($this->tree->getNode($header['i.alternative_node']));
61
                $symbols[1]['i.alternatives_node'] = $alternativesNode->getId();
62
                break;
63
64
            case SymbolType::NT_ALT_PARTS_TAIL . ".0.2":
65
                // SymbolType::NT_ALT_PARTS_TAIL
66
                $symbols[2]['i.alternatives_node'] = $symbols[1]['i.alternatives_node'];
67
                $symbols[2]['i.alternative_node'] = $symbols[1]['s.alternative_node'];
68
                break;
69
70
            case SymbolType::NT_PART . ".0.1":
71
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS]
72
                // SymbolType::NT_MORE_ITEMS
73
                $symbols[1]['i.concatenable_node'] = $symbols[0]['s.concatenable_node'];
74
                break;
75
76
            case SymbolType::NT_MORE_ITEMS . ".0.0":
77
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS_TAIL]
78
                // SymbolType::NT_ITEM
79
                $concatenateNode = $this
80
                    ->tree
81
                    ->createNode(NodeType::CONCATENATE)
82
                    ->addChild($this->tree->getNode($header['i.concatenable_node']));
83
                $symbols[0]['i.concatenate_node'] = $concatenateNode->getId();
84
                break;
85
86
            case SymbolType::NT_MORE_ITEMS . ".0.1":
87
                // SymbolType::NT_MORE_ITEMS_TAIL
88
                $symbols[1]['i.concatenable_node'] = $symbols[0]['s.concatenable_node'];
89
                $symbols[1]['i.concatenate_node'] = $symbols[0]['i.concatenate_node'];
90
                break;
91
92
            case SymbolType::NT_MORE_ITEMS_TAIL . ".0.0":
93
                // [SymbolType::NT_ITEM, SymbolType::NT_MORE_ITEMS_TAIL]
94
                // SymbolType::NT_ITEM
95
                $concatenateNode = $this
96
                    ->tree
97
                    ->getNode($header['i.concatenate_node'])
98
                    ->addChild($this->tree->getNode($header['i.concatenable_node']));
99
                $symbols[0]['i.concatenate_node'] = $concatenateNode->getId();
100
                break;
101
102
            case SymbolType::NT_MORE_ITEMS_TAIL . ".0.1":
103
                // SymbolType::NT_MORE_ITEMS_TAIL
104
                $symbols[1]['i.concatenable_node'] = $symbols[0]['s.concatenable_node'];
105
                $symbols[1]['i.concatenate_node'] = $symbols[0]['i.concatenate_node'];
106
                break;
107
108
            case SymbolType::NT_LIMIT . ".0.2":
109
                // [SymbolType::NT_LIMIT_START, SymbolType::NT_MIN, SymbolType::NT_OPT_MAX, SymbolType::NT_LIMIT_END]
110
                // SymbolType::NT_OPT_MAX
111
                $symbols[2]['i.min'] = $symbols[1]['s.number_value'];
112
                break;
113
114
            case SymbolType::NT_PROP_NAME . ".0.0":
115
                // [SymbolType::NT_PROP_NAME_PART]
116
                // SymbolType::NT_PROP_NAME_PART
117
                $symbols[0]['i.name'] = [];
118
                break;
119
120
            case SymbolType::NT_PROP_NAME_PART . ".0.1":
121
                // [SymbolType::NT_NOT_PROP_FINISH, SymbolType::NT_PROP_NAME_PART]
122
                // SymbolType::NT_PROP_NAME_PART
123
                $symbols[1]['i.name'] = array_merge($header['i.name'], [$symbols[0]['s.code']]);
124
                break;
125
126
            case SymbolType::NT_CLASS_BODY . ".0.2":
127
                // [SymbolType::NT_CLASS_INVERTER, SymbolType::NT_FIRST_INV_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS]
128
                // SymbolType::NT_CLASS_ITEMS
129
                $symbols[2]['i.not'] = true;
130
                $symbols[2]['i.symbol_node'] = $symbols[1]['s.symbol_node'];
131
                break;
132
133
            case SymbolType::NT_CLASS_BODY . ".1.1":
134
                // [SymbolType::NT_FIRST_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS]
135
                // SymbolType::NT_CLASS_ITEMS
136
                $symbols[1]['i.not'] = false;
137
                $symbols[1]['i.symbol_node'] = $symbols[0]['s.symbol_node'];
138
                break;
139
140
            case SymbolType::NT_FIRST_CLASS_ITEM . ".0.1":
141
            case SymbolType::NT_FIRST_INV_CLASS_ITEM . ".0.1":
142
                // [SymbolType::NT_FIRST_CLASS_SYMBOL, SymbolType::NT_RANGE]
143
                // SymbolType::NT_RANGE
144
                $symbolNode = $this
145
                    ->tree
146
                    ->createNode(NodeType::SYMBOL)
147
                    ->setAttribute('code', $symbols[0]['s.code']);
148
                $symbols[1]['i.symbol_node'] = $symbolNode->getId();
149
                break;
150
151
            case SymbolType::NT_FIRST_CLASS_ITEM . ".1.1":
152
            case SymbolType::NT_FIRST_INV_CLASS_ITEM . ".1.1":
153
                // [SymbolType::NT_ESC_CLASS_SYMBOL, SymbolType::NT_RANGE]
154
                // SymbolType::NT_RANGE
155
                $symbols[1]['i.symbol_node'] = $symbols[0]['s.symbol_node'];
156
                break;
157
158
            case SymbolType::NT_CLASS_ITEMS . ".0.1":
159
                // [SymbolType::NT_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS_TAIL]
160
                // SymbolType::NT_CLASS_ITEMS_TAIL
161
                $classNode = $this
162
                    ->tree
163
                    ->createNode(NodeType::SYMBOL_CLASS)
164
                    ->setAttribute('not', $header['i.not'])
165
                    ->addChild($this->tree->getNode($header['i.symbol_node']))
166
                    ->addChild($this->tree->getNode($symbols[0]['s.symbol_node']));
167
                $symbols[1]['i.class_node'] = $classNode->getId();
168
                break;
169
170
            case SymbolType::NT_CLASS_ITEMS_TAIL . ".0.1":
171
                // [SymbolType::NT_CLASS_ITEM, SymbolType::NT_CLASS_ITEMS_TAIL]
172
                // SymbolType::NT_CLASS_ITEMS_TAIL
173
                $classNode = $this
174
                    ->tree
175
                    ->getNode($header['i.class_node'])
176
                    ->addChild($this->tree->getNode($symbols[0]['s.symbol_node']));
177
                $symbols[1]['i.class_node'] = $classNode->getId();
178
                break;
179
180
            case SymbolType::NT_CLASS_ITEM . ".0.1":
181
                // [SymbolType::NT_CLASS_SYMBOL, SymbolType::NT_RANGE]
182
                // SymbolType::NT_RANGE
183
                $symbols[1]['i.symbol_node'] = $symbols[0]['s.symbol_node'];
184
                break;
185
        }
186
    }
187
}
188