|
9 | 9 | use function array_values; |
10 | 10 | use function count; |
11 | 11 | use function in_array; |
| 12 | +use function is_array; |
| 13 | +use function token_get_all; |
12 | 14 | use const T_ANON_CLASS; |
13 | 15 | use const T_ARRAY; |
14 | 16 | use const T_AS; |
|
23 | 25 | use const T_CONST; |
24 | 26 | use const T_DECLARE; |
25 | 27 | use const T_DOUBLE_COLON; |
| 28 | +use const T_DOUBLE_QUOTED_STRING; |
26 | 29 | use const T_ELLIPSIS; |
27 | 30 | use const T_EXTENDS; |
28 | 31 | use const T_FUNCTION; |
29 | 32 | use const T_GOTO; |
| 33 | +use const T_HEREDOC; |
30 | 34 | use const T_IMPLEMENTS; |
31 | 35 | use const T_INSTANCEOF; |
32 | 36 | use const T_NAMESPACE; |
33 | 37 | use const T_NEW; |
| 38 | +use const T_NS_SEPARATOR; |
34 | 39 | use const T_NULLABLE; |
35 | 40 | use const T_NULLSAFE_OBJECT_OPERATOR; |
36 | 41 | use const T_OBJECT_OPERATOR; |
37 | 42 | use const T_OPEN_PARENTHESIS; |
38 | 43 | use const T_OPEN_SHORT_ARRAY; |
39 | 44 | use const T_OPEN_TAG; |
40 | 45 | use const T_PARAM_NAME; |
| 46 | +use const T_STRING; |
41 | 47 | use const T_TRAIT; |
42 | 48 | use const T_TYPE_UNION; |
43 | 49 | use const T_USE; |
@@ -128,14 +134,32 @@ private static function createAllReferencedNames(File $phpcsFile, int $openTagPo |
128 | 134 |
|
129 | 135 | $beginSearchAtPointer = $openTagPointer + 1; |
130 | 136 | $nameTokenCodes = TokenHelper::getNameTokenCodes(); |
131 | | - $tokens = $phpcsFile->getTokens(); |
| 137 | + $nameTokenCodes[] = T_DOUBLE_QUOTED_STRING; |
132 | 138 |
|
| 139 | + $tokens = $phpcsFile->getTokens(); |
133 | 140 | while (true) { |
134 | 141 | $nameStartPointer = TokenHelper::findNext($phpcsFile, $nameTokenCodes, $beginSearchAtPointer); |
135 | 142 | if ($nameStartPointer === null) { |
136 | 143 | break; |
137 | 144 | } |
138 | 145 |
|
| 146 | + // Find referenced names inside double quotes string |
| 147 | + if (self::isNeedParsedContent($tokens[$nameStartPointer]['code'])) { |
| 148 | + $content = $tokens[$nameStartPointer]['content']; |
| 149 | + if (self::isNeedParsedContent($tokens[$nameStartPointer - 1]['code'])) { |
| 150 | + $content = '"' . $content; |
| 151 | + } |
| 152 | + if (self::isNeedParsedContent($tokens[$nameStartPointer + 1]['code'])) { |
| 153 | + $content .= '"'; |
| 154 | + } |
| 155 | + $names = self::getReferencedNamesFromString($content); |
| 156 | + foreach ($names as $name) { |
| 157 | + $referencedNames[] = new ReferencedName($name, $nameStartPointer, $nameStartPointer, ReferencedName::TYPE_CLASS); |
| 158 | + } |
| 159 | + $beginSearchAtPointer = $nameStartPointer + 1; |
| 160 | + continue; |
| 161 | + } |
| 162 | + |
139 | 163 | // Attributes are parsed in specific method |
140 | 164 | $attributeStartPointerBefore = TokenHelper::findPrevious($phpcsFile, T_ATTRIBUTE, $nameStartPointer - 1, $beginSearchAtPointer); |
141 | 165 | if ($attributeStartPointerBefore !== null) { |
@@ -435,4 +459,42 @@ private static function createAllReferencedNamesInAttributes(File $phpcsFile, in |
435 | 459 | return $referencedNames; |
436 | 460 | } |
437 | 461 |
|
| 462 | + /** |
| 463 | + * @param int|string $code |
| 464 | + * @return bool |
| 465 | + */ |
| 466 | + private static function isNeedParsedContent($code): bool |
| 467 | + { |
| 468 | + return in_array($code, [T_DOUBLE_QUOTED_STRING, T_HEREDOC], true); |
| 469 | + } |
| 470 | + |
| 471 | + /** |
| 472 | + * @param string $content |
| 473 | + * @return string[] |
| 474 | + */ |
| 475 | + private static function getReferencedNamesFromString(string $content): array |
| 476 | + { |
| 477 | + $referencedNames = []; |
| 478 | + $subTokens = token_get_all('<?php ' . $content); |
| 479 | + |
| 480 | + foreach ($subTokens as $position => $token) { |
| 481 | + if (is_array($token) && $token[0] === T_DOUBLE_COLON) { |
| 482 | + $referencedName = ''; |
| 483 | + $tmpPosition = $position - 1; |
| 484 | + while (true) { |
| 485 | + if (!is_array($subTokens[$tmpPosition]) || !in_array($subTokens[$tmpPosition][0], [T_NS_SEPARATOR, T_STRING], true)) { |
| 486 | + break; |
| 487 | + } |
| 488 | + |
| 489 | + $referencedName = $subTokens[$tmpPosition][1] . $referencedName; |
| 490 | + $tmpPosition--; |
| 491 | + } |
| 492 | + |
| 493 | + $referencedNames[] = $referencedName; |
| 494 | + } |
| 495 | + } |
| 496 | + |
| 497 | + return $referencedNames; |
| 498 | + } |
| 499 | + |
438 | 500 | } |
0 commit comments