Conditions | 15 |
Paths | 30 |
Total Lines | 86 |
Lines | 0 |
Ratio | 0 % |
Changes | 0 |
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:
If many parameters/temporary variables are present:
1 | <?php |
||
136 | public function processDelimiters(?Delimiter $stackBottom, DelimiterProcessorCollection $processors) |
||
137 | { |
||
138 | $openersBottom = []; |
||
139 | |||
140 | // Find first closer above stackBottom |
||
141 | $closer = $this->findEarliest($stackBottom); |
||
142 | |||
143 | // Move forward, looking for closers, and handling each |
||
144 | while ($closer !== null) { |
||
145 | $delimiterChar = $closer->getChar(); |
||
146 | |||
147 | $delimiterProcessor = $processors->getDelimiterProcessor($delimiterChar); |
||
148 | if (!$closer->canClose() || $delimiterProcessor === null) { |
||
149 | $closer = $closer->getNext(); |
||
150 | continue; |
||
151 | } |
||
152 | |||
153 | $openingDelimiterChar = $delimiterProcessor->getOpeningCharacter(); |
||
154 | |||
155 | $useDelims = 0; |
||
156 | $openerFound = false; |
||
157 | $potentialOpenerFound = false; |
||
158 | $opener = $closer->getPrevious(); |
||
159 | while ($opener !== null && $opener !== $stackBottom && $opener !== ($openersBottom[$delimiterChar] ?? null)) { |
||
160 | if ($opener->canOpen() && $opener->getChar() === $openingDelimiterChar) { |
||
161 | $potentialOpenerFound = true; |
||
162 | $useDelims = $delimiterProcessor->getDelimiterUse($opener, $closer); |
||
163 | if ($useDelims > 0) { |
||
164 | $openerFound = true; |
||
165 | break; |
||
166 | } |
||
167 | } |
||
168 | $opener = $opener->getPrevious(); |
||
169 | } |
||
170 | |||
171 | if (!$openerFound) { |
||
172 | if (!$potentialOpenerFound) { |
||
173 | // Only do this when we didn't even have a potential |
||
174 | // opener (one that matches the character and can open). |
||
175 | // If an opener was rejected because of the number of |
||
176 | // delimiters (e.g. because of the "multiple of 3" |
||
177 | // Set lower bound for future searches for openersrule), |
||
178 | // we want to consider it next time because the number |
||
179 | // of delimiters can change as we continue processing. |
||
180 | $openersBottom[$delimiterChar] = $closer->getPrevious(); |
||
181 | if (!$closer->canOpen()) { |
||
182 | // We can remove a closer that can't be an opener, |
||
183 | // once we've seen there's no matching opener. |
||
184 | $this->removeDelimiter($closer); |
||
185 | } |
||
186 | } |
||
187 | $closer = $closer->getNext(); |
||
188 | continue; |
||
189 | } |
||
190 | |||
191 | $openerNode = $opener->getInlineNode(); |
||
192 | $closerNode = $closer->getInlineNode(); |
||
193 | |||
194 | // Remove number of used delimiters from stack and inline nodes. |
||
195 | $opener->setNumDelims($opener->getNumDelims() - $useDelims); |
||
196 | $closer->setNumDelims($closer->getNumDelims() - $useDelims); |
||
197 | |||
198 | $openerNode->setContent(\substr($openerNode->getContent(), 0, -$useDelims)); |
||
199 | $closerNode->setContent(\substr($closerNode->getContent(), 0, -$useDelims)); |
||
200 | |||
201 | $this->removeDelimitersBetween($opener, $closer); |
||
|
|||
202 | // The delimiter processor can re-parent the nodes between opener and closer, |
||
203 | // so make sure they're contiguous already. Exclusive because we want to keep opener/closer themselves. |
||
204 | AdjacentTextMerger::mergeTextNodesBetweenExclusive($openerNode, $closerNode); |
||
205 | $delimiterProcessor->process($openerNode, $closerNode, $useDelims); |
||
206 | |||
207 | // No delimiter characters left to process, so we can remove delimiter and the now empty node. |
||
208 | if ($opener->getNumDelims() === 0) { |
||
209 | $this->removeDelimiterAndNode($opener); |
||
210 | } |
||
211 | |||
212 | if ($closer->getNumDelims() === 0) { |
||
213 | $next = $closer->getNext(); |
||
214 | $this->removeDelimiterAndNode($closer); |
||
215 | $closer = $next; |
||
216 | } |
||
217 | } |
||
218 | |||
219 | // Remove all delimiters |
||
220 | $this->removeAll($stackBottom); |
||
221 | } |
||
222 | } |
||
223 |
Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code: