33namespace SlevomatCodingStandard \Helpers ;
44
55use PHP_CodeSniffer \Files \File ;
6- use PHP_CodeSniffer \Util \Tokens ;
76use function array_key_exists ;
87use function array_reverse ;
98use function array_values ;
3534use const T_HEREDOC ;
3635use const T_IMPLEMENTS ;
3736use const T_INSTANCEOF ;
38- use const T_NAME_FULLY_QUALIFIED ;
39- use const T_NAME_QUALIFIED ;
40- use const T_NAME_RELATIVE ;
4137use const T_NAMESPACE ;
4238use const T_NEW ;
4339use const T_NS_SEPARATOR ;
@@ -82,44 +78,6 @@ public static function getAllReferencedNamesInAttributes(File $phpcsFile, int $o
8278 return SniffLocalCache::getAndSetIfNotCached ($ phpcsFile , 'referencesFromAttributes ' , $ lazyValue );
8379 }
8480
85- public static function getReferenceName (File $ phpcsFile , int $ nameStartPointer , int $ nameEndPointer ): string
86- {
87- $ tokens = $ phpcsFile ->getTokens ();
88-
89- $ referencedName = '' ;
90- for ($ i = $ nameStartPointer ; $ i <= $ nameEndPointer ; $ i ++) {
91- if (in_array ($ tokens [$ i ]['code ' ], Tokens::$ emptyTokens , true )) {
92- continue ;
93- }
94-
95- $ referencedName .= $ tokens [$ i ]['content ' ];
96- }
97-
98- return $ referencedName ;
99- }
100-
101- public static function getReferencedNameEndPointer (File $ phpcsFile , int $ startPointer ): int
102- {
103- $ tokens = $ phpcsFile ->getTokens ();
104-
105- $ nameTokenCodesWithWhitespace = [...TokenHelper::NAME_TOKEN_CODES , ...TokenHelper::INEFFECTIVE_TOKEN_CODES ];
106-
107- $ lastNamePointer = $ startPointer ;
108- for ($ i = $ startPointer + 1 ; $ i < count ($ tokens ); $ i ++) {
109- if (!in_array ($ tokens [$ i ]['code ' ], $ nameTokenCodesWithWhitespace , true )) {
110- break ;
111- }
112-
113- if (!in_array ($ tokens [$ i ]['code ' ], TokenHelper::NAME_TOKEN_CODES , true )) {
114- continue ;
115- }
116-
117- $ lastNamePointer = $ i ;
118- }
119-
120- return $ lastNamePointer ;
121- }
122-
12381 /**
12482 * @return list<ReferencedName>
12583 */
@@ -134,57 +92,55 @@ private static function createAllReferencedNames(File $phpcsFile, int $openTagPo
13492
13593 $ tokens = $ phpcsFile ->getTokens ();
13694 while (true ) {
137- $ nameStartPointer = TokenHelper::findNext ($ phpcsFile , $ nameTokenCodes , $ beginSearchAtPointer );
138- if ($ nameStartPointer === null ) {
95+ $ namePointer = TokenHelper::findNext ($ phpcsFile , $ nameTokenCodes , $ beginSearchAtPointer );
96+ if ($ namePointer === null ) {
13997 break ;
14098 }
14199
142100 // Find referenced names inside double quotes string
143- if (self ::isNeedParsedContent ($ tokens [$ nameStartPointer ]['code ' ])) {
144- $ content = $ tokens [$ nameStartPointer ]['content ' ];
145- $ currentPointer = $ nameStartPointer + 1 ;
101+ if (self ::isNeedParsedContent ($ tokens [$ namePointer ]['code ' ])) {
102+ $ content = $ tokens [$ namePointer ]['content ' ];
103+ $ currentPointer = $ namePointer + 1 ;
146104 while (self ::isNeedParsedContent ($ tokens [$ currentPointer ]['code ' ])) {
147105 $ content .= $ tokens [$ currentPointer ]['content ' ];
148106 $ currentPointer ++;
149107 }
150108
151109 $ names = self ::getReferencedNamesFromString ($ content );
152110 foreach ($ names as $ name ) {
153- $ referencedNames [] = new ReferencedName ($ name , $ nameStartPointer , $ nameStartPointer , ReferencedName::TYPE_CLASS );
111+ $ referencedNames [] = new ReferencedName ($ name , $ namePointer , $ namePointer , ReferencedName::TYPE_CLASS );
154112 }
155113
156114 $ beginSearchAtPointer = $ currentPointer ;
157115 continue ;
158116 }
159117
160118 // Attributes are parsed in specific method
161- $ attributeStartPointerBefore = TokenHelper::findPrevious ($ phpcsFile , T_ATTRIBUTE , $ nameStartPointer - 1 , $ beginSearchAtPointer );
119+ $ attributeStartPointerBefore = TokenHelper::findPrevious ($ phpcsFile , T_ATTRIBUTE , $ namePointer - 1 , $ beginSearchAtPointer );
162120 if ($ attributeStartPointerBefore !== null ) {
163- if ($ tokens [$ attributeStartPointerBefore ]['attribute_closer ' ] > $ nameStartPointer ) {
121+ if ($ tokens [$ attributeStartPointerBefore ]['attribute_closer ' ] > $ namePointer ) {
164122 $ beginSearchAtPointer = $ tokens [$ attributeStartPointerBefore ]['attribute_closer ' ] + 1 ;
165123 continue ;
166124 }
167125 }
168126
169- if (!self ::isReferencedName ($ phpcsFile , $ nameStartPointer )) {
127+ if (!self ::isReferencedName ($ phpcsFile , $ namePointer )) {
170128 /** @var int $beginSearchAtPointer */
171129 $ beginSearchAtPointer = TokenHelper::findNextExcluding (
172130 $ phpcsFile ,
173131 [...TokenHelper::INEFFECTIVE_TOKEN_CODES , ...$ nameTokenCodes ],
174- $ nameStartPointer + 1 ,
132+ $ namePointer + 1 ,
175133 );
176134 continue ;
177135 }
178136
179- $ nameEndPointer = self ::getReferencedNameEndPointer ($ phpcsFile , $ nameStartPointer );
180-
181137 $ referencedNames [] = new ReferencedName (
182- self :: getReferenceName ( $ phpcsFile , $ nameStartPointer , $ nameEndPointer ) ,
183- $ nameStartPointer ,
184- $ nameEndPointer ,
185- self ::getReferenceType ($ phpcsFile , $ nameStartPointer , $ nameEndPointer ),
138+ $ tokens [ $ namePointer ][ ' content ' ] ,
139+ $ namePointer ,
140+ $ namePointer ,
141+ self ::getReferenceType ($ phpcsFile , $ namePointer , $ namePointer ),
186142 );
187- $ beginSearchAtPointer = $ nameEndPointer + 1 ;
143+ $ beginSearchAtPointer = $ namePointer + 1 ;
188144 }
189145 return $ referencedNames ;
190146 }
@@ -385,8 +341,7 @@ private static function isReferencedName(File $phpcsFile, int $startPointer): bo
385341 return false ;
386342 }
387343
388- $ endPointer = self ::getReferencedNameEndPointer ($ phpcsFile , $ startPointer );
389- $ referencedName = self ::getReferenceName ($ phpcsFile , $ startPointer , $ endPointer );
344+ $ referencedName = $ tokens [$ startPointer ]['content ' ];
390345
391346 if (TypeHintHelper::isSimpleTypeHint ($ referencedName ) || $ referencedName === 'object ' ) {
392347 return $ tokens [$ nextPointer ]['code ' ] === T_OPEN_PARENTHESIS ;
@@ -432,22 +387,20 @@ private static function createAllReferencedNamesInAttributes(File $phpcsFile, in
432387 continue ;
433388 }
434389
435- $ referencedNameEndPointer = self ::getReferencedNameEndPointer ($ phpcsFile , $ pointer );
436-
437390 $ pointerBefore = TokenHelper::findPreviousEffective ($ phpcsFile , $ pointer - 1 );
438391
439392 if (in_array ($ tokens [$ pointerBefore ]['code ' ], [T_OPEN_TAG , T_ATTRIBUTE ], true )) {
440393 $ referenceType = ReferencedName::TYPE_CLASS ;
441394 } elseif ($ tokens [$ pointerBefore ]['code ' ] === T_COMMA && $ level === 0 ) {
442395 $ referenceType = ReferencedName::TYPE_CLASS ;
443396 } elseif (self ::isReferencedName ($ phpcsFile , $ pointer )) {
444- $ referenceType = self ::getReferenceType ($ phpcsFile , $ pointer , $ referencedNameEndPointer );
397+ $ referenceType = self ::getReferenceType ($ phpcsFile , $ pointer , $ pointer );
445398 } else {
446399 $ searchPointer = $ pointer + 1 ;
447400 continue ;
448401 }
449402
450- $ referencedName = self :: getReferenceName ( $ phpcsFile , $ pointer, $ referencedNameEndPointer ) ;
403+ $ referencedName = $ tokens [ $ pointer][ ' content ' ] ;
451404
452405 $ referencedNames [] = new ReferencedName (
453406 $ referencedName ,
@@ -456,7 +409,7 @@ private static function createAllReferencedNamesInAttributes(File $phpcsFile, in
456409 $ referenceType ,
457410 );
458411
459- $ searchPointer = $ referencedNameEndPointer + 1 ;
412+ $ searchPointer = $ pointer + 1 ;
460413
461414 } while (true );
462415 }
@@ -485,7 +438,7 @@ private static function getReferencedNamesFromString(string $content): array
485438 $ referencedName = '' ;
486439 $ tmpPosition = $ position - 1 ;
487440 while (true ) {
488- if (!is_array ($ subTokens [$ tmpPosition ]) || ! in_array ( $ subTokens [$ tmpPosition ][0 ], [ T_NS_SEPARATOR , T_STRING ], true ) ) {
441+ if (!is_array ($ subTokens [$ tmpPosition ]) || $ subTokens [$ tmpPosition ][0 ] !== T_STRING ) {
489442 break ;
490443 }
491444
@@ -505,11 +458,8 @@ private static function getReferencedNamesFromString(string $content): array
505458 $ tmpPosition ++;
506459 continue ;
507460 }
508- if (!in_array (
509- $ subTokens [$ tmpPosition ][0 ],
510- [T_STRING , T_NS_SEPARATOR , T_NAME_QUALIFIED , T_NAME_FULLY_QUALIFIED , T_NAME_RELATIVE ],
511- true ,
512- )) {
461+ // We need to check namespace separator because of support for PHP 7.4
462+ if (!in_array ($ subTokens [$ tmpPosition ][0 ], [T_NS_SEPARATOR , ...TokenHelper::NAME_TOKEN_CODES ], true )) {
513463 break ;
514464 }
515465
0 commit comments