Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like PHPTokenizerInternal often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use PHPTokenizerInternal, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
176 | class PHPTokenizerInternal implements Tokenizer |
||
177 | { |
||
178 | /** |
||
179 | * Mapping between php internal tokens and php depend tokens. |
||
180 | * |
||
181 | * @var array<integer, integer> |
||
182 | */ |
||
183 | protected static $tokenMap = array( |
||
184 | T_AS => Tokens::T_AS, |
||
185 | T_DO => Tokens::T_DO, |
||
186 | T_IF => Tokens::T_IF, |
||
187 | T_SL => Tokens::T_SL, |
||
188 | T_SR => Tokens::T_SR, |
||
189 | T_DEC => Tokens::T_DEC, |
||
190 | T_FOR => Tokens::T_FOR, |
||
191 | T_INC => Tokens::T_INC, |
||
192 | T_NEW => Tokens::T_NEW, |
||
193 | T_POW => Tokens::T_POW, |
||
194 | T_TRY => Tokens::T_TRY, |
||
195 | T_USE => Tokens::T_USE, |
||
196 | T_VAR => Tokens::T_VAR, |
||
197 | T_CASE => Tokens::T_CASE, |
||
198 | T_ECHO => Tokens::T_ECHO, |
||
199 | T_ELSE => Tokens::T_ELSE, |
||
200 | T_EVAL => Tokens::T_EVAL, |
||
201 | T_EXIT => Tokens::T_EXIT, |
||
202 | T_FILE => Tokens::T_FILE, |
||
203 | T_GOTO => Tokens::T_GOTO, |
||
204 | T_LINE => Tokens::T_LINE, |
||
205 | T_LIST => Tokens::T_LIST, |
||
206 | T_NS_C => Tokens::T_NS_C, |
||
207 | T_ARRAY => Tokens::T_ARRAY, |
||
208 | T_BREAK => Tokens::T_BREAK, |
||
209 | T_CLASS => Tokens::T_CLASS, |
||
210 | T_CATCH => Tokens::T_CATCH, |
||
211 | T_CLONE => Tokens::T_CLONE, |
||
212 | T_CONST => Tokens::T_CONST, |
||
213 | T_EMPTY => Tokens::T_EMPTY, |
||
214 | T_ENDIF => Tokens::T_ENDIF, |
||
215 | T_FINAL => Tokens::T_FINAL, |
||
216 | T_ISSET => Tokens::T_ISSET, |
||
217 | T_PRINT => Tokens::T_PRINT, |
||
218 | T_THROW => Tokens::T_THROW, |
||
219 | T_TRAIT => Tokens::T_TRAIT, |
||
220 | T_UNSET => Tokens::T_UNSET, |
||
221 | T_WHILE => Tokens::T_WHILE, |
||
222 | T_ENDFOR => Tokens::T_ENDFOR, |
||
223 | T_ELSEIF => Tokens::T_ELSEIF, |
||
224 | T_FUNC_C => Tokens::T_FUNC_C, |
||
225 | T_GLOBAL => Tokens::T_GLOBAL, |
||
226 | T_PUBLIC => Tokens::T_PUBLIC, |
||
227 | T_RETURN => Tokens::T_RETURN, |
||
228 | T_STATIC => Tokens::T_STATIC, |
||
229 | T_STRING => Tokens::T_STRING, |
||
230 | T_SWITCH => Tokens::T_SWITCH, |
||
231 | T_CLASS_C => Tokens::T_CLASS_C, |
||
232 | T_COMMENT => Tokens::T_COMMENT, |
||
233 | T_DECLARE => Tokens::T_DECLARE, |
||
234 | T_DEFAULT => Tokens::T_DEFAULT, |
||
235 | T_DNUMBER => Tokens::T_DNUMBER, |
||
236 | T_EXTENDS => Tokens::T_EXTENDS, |
||
237 | T_FOREACH => Tokens::T_FOREACH, |
||
238 | T_INCLUDE => Tokens::T_INCLUDE, |
||
239 | T_LNUMBER => Tokens::T_LNUMBER, |
||
240 | T_PRIVATE => Tokens::T_PRIVATE, |
||
241 | T_REQUIRE => Tokens::T_REQUIRE, |
||
242 | T_TRAIT_C => Tokens::T_TRAIT_C, |
||
243 | T_ABSTRACT => Tokens::T_ABSTRACT, |
||
244 | T_CALLABLE => Tokens::T_CALLABLE, |
||
245 | T_ENDWHILE => Tokens::T_ENDWHILE, |
||
246 | T_FUNCTION => Tokens::T_FUNCTION, |
||
247 | T_INT_CAST => Tokens::T_INT_CAST, |
||
248 | T_IS_EQUAL => Tokens::T_IS_EQUAL, |
||
249 | T_OR_EQUAL => Tokens::T_OR_EQUAL, |
||
250 | T_CONTINUE => Tokens::T_CONTINUE, |
||
251 | T_METHOD_C => Tokens::T_METHOD_C, |
||
252 | T_ELLIPSIS => Tokens::T_ELLIPSIS, |
||
253 | T_OPEN_TAG => Tokens::T_OPEN_TAG, |
||
254 | T_SL_EQUAL => Tokens::T_SL_EQUAL, |
||
255 | T_SR_EQUAL => Tokens::T_SR_EQUAL, |
||
256 | T_VARIABLE => Tokens::T_VARIABLE, |
||
257 | T_ENDSWITCH => Tokens::T_ENDSWITCH, |
||
258 | T_DIV_EQUAL => Tokens::T_DIV_EQUAL, |
||
259 | T_AND_EQUAL => Tokens::T_AND_EQUAL, |
||
260 | T_MOD_EQUAL => Tokens::T_MOD_EQUAL, |
||
261 | T_MUL_EQUAL => Tokens::T_MUL_EQUAL, |
||
262 | T_NAMESPACE => Tokens::T_NAMESPACE, |
||
263 | T_XOR_EQUAL => Tokens::T_XOR_EQUAL, |
||
264 | T_INTERFACE => Tokens::T_INTERFACE, |
||
265 | T_BOOL_CAST => Tokens::T_BOOL_CAST, |
||
266 | T_CHARACTER => Tokens::T_CHARACTER, |
||
267 | T_CLOSE_TAG => Tokens::T_CLOSE_TAG, |
||
268 | T_INSTEADOF => Tokens::T_INSTEADOF, |
||
269 | T_PROTECTED => Tokens::T_PROTECTED, |
||
270 | T_SPACESHIP => Tokens::T_SPACESHIP, |
||
271 | T_CURLY_OPEN => Tokens::T_CURLY_BRACE_OPEN, |
||
272 | T_ENDFOREACH => Tokens::T_ENDFOREACH, |
||
273 | T_ENDDECLARE => Tokens::T_ENDDECLARE, |
||
274 | T_IMPLEMENTS => Tokens::T_IMPLEMENTS, |
||
275 | T_NUM_STRING => Tokens::T_NUM_STRING, |
||
276 | T_PLUS_EQUAL => Tokens::T_PLUS_EQUAL, |
||
277 | T_ARRAY_CAST => Tokens::T_ARRAY_CAST, |
||
278 | T_BOOLEAN_OR => Tokens::T_BOOLEAN_OR, |
||
279 | T_INSTANCEOF => Tokens::T_INSTANCEOF, |
||
280 | T_LOGICAL_OR => Tokens::T_LOGICAL_OR, |
||
281 | T_UNSET_CAST => Tokens::T_UNSET_CAST, |
||
282 | T_DOC_COMMENT => Tokens::T_DOC_COMMENT, |
||
283 | T_END_HEREDOC => Tokens::T_END_HEREDOC, |
||
284 | T_MINUS_EQUAL => Tokens::T_MINUS_EQUAL, |
||
285 | T_BOOLEAN_AND => Tokens::T_BOOLEAN_AND, |
||
286 | T_DOUBLE_CAST => Tokens::T_DOUBLE_CAST, |
||
287 | T_INLINE_HTML => Tokens::T_INLINE_HTML, |
||
288 | T_LOGICAL_AND => Tokens::T_LOGICAL_AND, |
||
289 | T_LOGICAL_XOR => Tokens::T_LOGICAL_XOR, |
||
290 | T_OBJECT_CAST => Tokens::T_OBJECT_CAST, |
||
291 | T_STRING_CAST => Tokens::T_STRING_CAST, |
||
292 | T_DOUBLE_ARROW => Tokens::T_DOUBLE_ARROW, |
||
293 | T_INCLUDE_ONCE => Tokens::T_INCLUDE_ONCE, |
||
294 | T_IS_IDENTICAL => Tokens::T_IS_IDENTICAL, |
||
295 | T_DOUBLE_COLON => Tokens::T_DOUBLE_COLON, |
||
296 | T_CONCAT_EQUAL => Tokens::T_CONCAT_EQUAL, |
||
297 | T_IS_NOT_EQUAL => Tokens::T_IS_NOT_EQUAL, |
||
298 | T_REQUIRE_ONCE => Tokens::T_REQUIRE_ONCE, |
||
299 | T_BAD_CHARACTER => Tokens::T_BAD_CHARACTER, |
||
300 | T_HALT_COMPILER => Tokens::T_HALT_COMPILER, |
||
301 | T_START_HEREDOC => Tokens::T_START_HEREDOC, |
||
302 | T_STRING_VARNAME => Tokens::T_STRING_VARNAME, |
||
303 | T_OBJECT_OPERATOR => Tokens::T_OBJECT_OPERATOR, |
||
304 | T_IS_NOT_IDENTICAL => Tokens::T_IS_NOT_IDENTICAL, |
||
305 | T_OPEN_TAG_WITH_ECHO => Tokens::T_OPEN_TAG_WITH_ECHO, |
||
306 | T_IS_GREATER_OR_EQUAL => Tokens::T_IS_GREATER_OR_EQUAL, |
||
307 | T_IS_SMALLER_OR_EQUAL => Tokens::T_IS_SMALLER_OR_EQUAL, |
||
308 | //T_PAAMAYIM_NEKUDOTAYIM => Tokens::T_DOUBLE_COLON, |
||
309 | T_ENCAPSED_AND_WHITESPACE => Tokens::T_ENCAPSED_AND_WHITESPACE, |
||
310 | T_CONSTANT_ENCAPSED_STRING => Tokens::T_CONSTANT_ENCAPSED_STRING, |
||
311 | T_YIELD => Tokens::T_YIELD, |
||
312 | T_FINALLY => Tokens::T_FINALLY, |
||
313 | T_COALESCE => Tokens::T_COALESCE, |
||
314 | //T_DOLLAR_OPEN_CURLY_BRACES => Tokens::T_CURLY_BRACE_OPEN, |
||
315 | ); |
||
316 | |||
317 | /** |
||
318 | * Internally used transition token. |
||
319 | */ |
||
320 | const T_ELLIPSIS = 23006; |
||
321 | |||
322 | /** |
||
323 | * Mapping between php internal text tokens an php depend numeric tokens. |
||
324 | * |
||
325 | * @var array<string, integer> |
||
326 | */ |
||
327 | protected static $literalMap = array( |
||
328 | '@' => Tokens::T_AT, |
||
329 | '/' => Tokens::T_DIV, |
||
330 | '%' => Tokens::T_MOD, |
||
331 | '*' => Tokens::T_MUL, |
||
332 | '+' => Tokens::T_PLUS, |
||
333 | ':' => Tokens::T_COLON, |
||
334 | ',' => Tokens::T_COMMA, |
||
335 | '=' => Tokens::T_EQUAL, |
||
336 | '-' => Tokens::T_MINUS, |
||
337 | '.' => Tokens::T_CONCAT, |
||
338 | '$' => Tokens::T_DOLLAR, |
||
339 | '`' => Tokens::T_BACKTICK, |
||
340 | '\\' => Tokens::T_BACKSLASH, |
||
341 | ';' => Tokens::T_SEMICOLON, |
||
342 | '|' => Tokens::T_BITWISE_OR, |
||
343 | '&' => Tokens::T_BITWISE_AND, |
||
344 | '~' => Tokens::T_BITWISE_NOT, |
||
345 | '^' => Tokens::T_BITWISE_XOR, |
||
346 | '"' => Tokens::T_DOUBLE_QUOTE, |
||
347 | '?' => Tokens::T_QUESTION_MARK, |
||
348 | '!' => Tokens::T_EXCLAMATION_MARK, |
||
349 | '{' => Tokens::T_CURLY_BRACE_OPEN, |
||
350 | '}' => Tokens::T_CURLY_BRACE_CLOSE, |
||
351 | '(' => Tokens::T_PARENTHESIS_OPEN, |
||
352 | ')' => Tokens::T_PARENTHESIS_CLOSE, |
||
353 | '<' => Tokens::T_ANGLE_BRACKET_OPEN, |
||
354 | '>' => Tokens::T_ANGLE_BRACKET_CLOSE, |
||
355 | '[' => Tokens::T_SQUARED_BRACKET_OPEN, |
||
356 | ']' => Tokens::T_SQUARED_BRACKET_CLOSE, |
||
357 | 'use' => Tokens::T_USE, |
||
358 | 'goto' => Tokens::T_GOTO, |
||
359 | 'null' => Tokens::T_NULL, |
||
360 | 'self' => Tokens::T_SELF, |
||
361 | 'true' => Tokens::T_TRUE, |
||
362 | 'array' => Tokens::T_ARRAY, |
||
363 | 'false' => Tokens::T_FALSE, |
||
364 | 'trait' => Tokens::T_TRAIT, |
||
365 | 'yield' => Tokens::T_YIELD, |
||
366 | 'yield from' => Tokens::T_YIELD, |
||
367 | 'parent' => Tokens::T_PARENT, |
||
368 | 'finally' => Tokens::T_FINALLY, |
||
369 | 'callable' => Tokens::T_CALLABLE, |
||
370 | 'insteadof' => Tokens::T_INSTEADOF, |
||
371 | 'namespace' => Tokens::T_NAMESPACE, |
||
372 | '__dir__' => Tokens::T_DIR, |
||
373 | '__trait__' => Tokens::T_TRAIT_C, |
||
374 | '__namespace__' => Tokens::T_NS_C, |
||
375 | ); |
||
376 | |||
377 | /** |
||
378 | * |
||
379 | * @var array<mixed, array> |
||
380 | */ |
||
381 | protected static $substituteTokens = array( |
||
382 | T_DOLLAR_OPEN_CURLY_BRACES => array('$', '{'), |
||
383 | ); |
||
384 | |||
385 | /** |
||
386 | * BuilderContext sensitive alternative mappings. |
||
387 | * |
||
388 | * @var array<integer, array> |
||
389 | */ |
||
390 | protected static $alternativeMap = array( |
||
391 | Tokens::T_USE => array( |
||
392 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
393 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
394 | Tokens::T_CONST => Tokens::T_STRING, |
||
395 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
396 | ), |
||
397 | |||
398 | Tokens::T_GOTO => array( |
||
399 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
400 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
401 | Tokens::T_CONST => Tokens::T_STRING, |
||
402 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
403 | ), |
||
404 | |||
405 | Tokens::T_NULL => array( |
||
406 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
407 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
408 | Tokens::T_CONST => Tokens::T_STRING, |
||
409 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
410 | ), |
||
411 | |||
412 | Tokens::T_SELF => array( |
||
413 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
414 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
415 | Tokens::T_CONST => Tokens::T_STRING, |
||
416 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
417 | ), |
||
418 | |||
419 | Tokens::T_TRUE => array( |
||
420 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
421 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
422 | Tokens::T_NAMESPACE => Tokens::T_STRING, |
||
423 | Tokens::T_CONST => Tokens::T_STRING, |
||
424 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
425 | ), |
||
426 | |||
427 | Tokens::T_ARRAY => array( |
||
428 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
429 | ), |
||
430 | |||
431 | Tokens::T_FALSE => array( |
||
432 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
433 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
434 | Tokens::T_NAMESPACE => Tokens::T_STRING, |
||
435 | Tokens::T_CONST => Tokens::T_STRING, |
||
436 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
437 | ), |
||
438 | |||
439 | Tokens::T_NAMESPACE => array( |
||
440 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
441 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
442 | Tokens::T_CONST => Tokens::T_STRING, |
||
443 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
444 | ), |
||
445 | |||
446 | Tokens::T_DIR => array( |
||
447 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
448 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
449 | Tokens::T_CONST => Tokens::T_STRING, |
||
450 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
451 | ), |
||
452 | |||
453 | Tokens::T_NS_C => array( |
||
454 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
455 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
456 | Tokens::T_CONST => Tokens::T_STRING, |
||
457 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
458 | ), |
||
459 | |||
460 | Tokens::T_PARENT => array( |
||
461 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
462 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
463 | Tokens::T_CONST => Tokens::T_STRING, |
||
464 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
465 | ), |
||
466 | |||
467 | Tokens::T_FINALLY => array( |
||
468 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
469 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
470 | Tokens::T_CONST => Tokens::T_STRING, |
||
471 | Tokens::T_FUNCTION => Tokens::T_STRING, |
||
472 | ), |
||
473 | |||
474 | Tokens::T_CALLABLE => array( |
||
475 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
476 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
477 | ), |
||
478 | |||
479 | Tokens::T_LIST => array( |
||
480 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
481 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
482 | ), |
||
483 | |||
484 | Tokens::T_EMPTY => array( |
||
485 | Tokens::T_OBJECT_OPERATOR => Tokens::T_STRING, |
||
486 | Tokens::T_DOUBLE_COLON => Tokens::T_STRING, |
||
487 | ), |
||
488 | |||
489 | Tokens::T_CLASS => array( |
||
490 | Tokens::T_DOUBLE_COLON => Tokens::T_CLASS_FQN, |
||
491 | ), |
||
492 | ); |
||
493 | |||
494 | protected static $reductionMap = array( |
||
495 | Tokens::T_CONCAT => array( |
||
496 | Tokens::T_CONCAT => array( |
||
497 | 'type' => self::T_ELLIPSIS, |
||
498 | 'image' => '..', |
||
499 | ), |
||
500 | self::T_ELLIPSIS => array( |
||
501 | 'type' => Tokens::T_ELLIPSIS, |
||
502 | 'image' => '...', |
||
503 | ) |
||
504 | ), |
||
505 | |||
506 | Tokens::T_ANGLE_BRACKET_CLOSE => array( |
||
507 | Tokens::T_IS_SMALLER_OR_EQUAL => array( |
||
508 | 'type' => Tokens::T_SPACESHIP, |
||
509 | 'image' => '<=>', |
||
510 | ) |
||
511 | ), |
||
512 | |||
513 | Tokens::T_QUESTION_MARK => array( |
||
514 | Tokens::T_QUESTION_MARK => array( |
||
515 | 'type' => Tokens::T_COALESCE, |
||
516 | 'image' => '??', |
||
517 | ) |
||
518 | ), |
||
519 | |||
520 | Tokens::T_MUL => array( |
||
521 | Tokens::T_MUL => array( |
||
522 | 'type' => Tokens::T_POW, |
||
523 | 'image' => '**', |
||
524 | ) |
||
525 | ), |
||
526 | ); |
||
527 | |||
528 | /** |
||
529 | * The source file instance. |
||
530 | * |
||
531 | * @var \PDepend\Source\AST\ASTCompilationUnit |
||
532 | */ |
||
533 | protected $sourceFile = ''; |
||
534 | |||
535 | /** |
||
536 | * Count of all tokens. |
||
537 | * |
||
538 | * @var integer |
||
539 | */ |
||
540 | protected $count = 0; |
||
541 | |||
542 | /** |
||
543 | * Internal stream pointer index. |
||
544 | * |
||
545 | * @var integer |
||
546 | */ |
||
547 | protected $index = 0; |
||
548 | |||
549 | /** |
||
550 | * Prepared token list. |
||
551 | * |
||
552 | * @var Token[]|null |
||
553 | */ |
||
554 | protected $tokens = null; |
||
555 | |||
556 | /** |
||
557 | * The next free identifier for unknown string tokens. |
||
558 | * |
||
559 | * @var integer |
||
560 | */ |
||
561 | private $unknownTokenID = 1000; |
||
562 | |||
563 | /** |
||
564 | * Returns the name of the source file. |
||
565 | * |
||
566 | * @return \PDepend\Source\AST\ASTCompilationUnit |
||
567 | */ |
||
568 | public function getSourceFile() |
||
572 | |||
573 | /** |
||
574 | * Sets a new php source file. |
||
575 | * |
||
576 | * @param string $sourceFile A php source file. |
||
577 | * |
||
578 | * @return void |
||
579 | */ |
||
580 | 28 | public function setSourceFile($sourceFile) |
|
585 | |||
586 | /** |
||
587 | * Returns the next token or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if |
||
588 | * there is no next token. |
||
589 | * |
||
590 | * @return Token|integer |
||
591 | */ |
||
592 | 26 | View Code Duplication | public function next() |
601 | |||
602 | /** |
||
603 | * Returns the next token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_EOF} if |
||
604 | * there is no next token. |
||
605 | * |
||
606 | * @return integer |
||
607 | */ |
||
608 | View Code Duplication | public function peek() |
|
617 | |||
618 | /** |
||
619 | * Returns the type of next token, after the current token. This method |
||
620 | * ignores all comments between the current and the next token. |
||
621 | * |
||
622 | * @return integer |
||
623 | * @since 0.9.12 |
||
624 | */ |
||
625 | public function peekNext() |
||
635 | |||
636 | /** |
||
637 | * Returns the previous token type or {@link \PDepend\Source\Tokenizer\Tokenizer::T_BOF} |
||
638 | * if there is no previous token. |
||
639 | * |
||
640 | * @return integer |
||
641 | */ |
||
642 | 2 | View Code Duplication | public function prev() |
651 | |||
652 | /** |
||
653 | * This method takes an array of tokens returned by <b>token_get_all()</b> |
||
654 | * and substitutes some of the tokens with those required by PDepend's |
||
655 | * parser implementation. |
||
656 | * |
||
657 | * @param array<array> $tokens Unprepared array of php tokens. |
||
658 | * |
||
659 | * @return array<array> |
||
660 | */ |
||
661 | 28 | private function substituteTokens(array $tokens) |
|
677 | |||
678 | /** |
||
679 | * Tokenizes the content of the source file with {@link token_get_all()} and |
||
680 | * filters this token stream. |
||
681 | * |
||
682 | * @return void |
||
683 | */ |
||
684 | 28 | private function tokenize() |
|
838 | |||
839 | /** |
||
840 | * This method fetches all tokens until an opening php tag was found and it |
||
841 | * returns the collected content. The returned value will be null if there |
||
842 | * was no none php token. |
||
843 | * |
||
844 | * @param array $tokens Reference to the current token stream. |
||
845 | * |
||
846 | * @return string |
||
847 | */ |
||
848 | 6 | private function consumeNonePhpTokens(array &$tokens) |
|
872 | |||
873 | /** |
||
874 | * Generates a dummy/temp token for unknown string literals. |
||
875 | * |
||
876 | * @param string $token The unknown string token. |
||
877 | * |
||
878 | * @return array<integer, mixed> |
||
879 | */ |
||
880 | private function generateUnknownToken($token) |
||
884 | } |
||
885 |
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.