| 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: