99use function array_values ;
1010use function count ;
1111use function in_array ;
12- use function substr ;
13- use function trim ;
1412use const T_ANON_CLASS ;
1513use const T_ARRAY ;
1614use const T_AS ;
15+ use const T_ATTRIBUTE ;
1716use const T_BITWISE_AND ;
1817use const T_BITWISE_OR ;
1918use const T_CATCH ;
2019use const T_CLASS ;
2120use const T_CLOSE_PARENTHESIS ;
22- use const T_CLOSE_SQUARE_BRACKET ;
2321use const T_COLON ;
2422use const T_COMMA ;
25- use const T_COMMENT ;
2623use const T_CONST ;
2724use const T_DECLARE ;
2825use const T_DOUBLE_COLON ;
@@ -139,20 +136,16 @@ private static function createAllReferencedNames(File $phpcsFile, int $openTagPo
139136 }
140137
141138 // Attributes are parsed in specific method
142- $ attributeStartPointerBefore = TokenHelper::findPrevious (
143- $ phpcsFile ,
144- TokenHelper::getAttributeTokenCode (),
145- $ nameStartPointer - 1
146- );
147- if ($ attributeStartPointerBefore !== null && StringHelper::startsWith ($ tokens [$ attributeStartPointerBefore ]['content ' ], '#[ ' )) {
148- $ attributeEndPointerBefore = self ::getAttributeEndPointer ($ phpcsFile , $ attributeStartPointerBefore );
149- if ($ attributeEndPointerBefore > $ nameStartPointer ) {
150- $ beginSearchAtPointer = $ attributeEndPointerBefore + 1 ;
139+ $ attributeStartPointerBefore = TokenHelper::findPrevious ($ phpcsFile , T_ATTRIBUTE , $ nameStartPointer - 1 );
140+ if ($ attributeStartPointerBefore !== null ) {
141+ if ($ tokens [$ attributeStartPointerBefore ]['attribute_closer ' ] > $ nameStartPointer ) {
142+ $ beginSearchAtPointer = $ tokens [$ attributeStartPointerBefore ]['attribute_closer ' ] + 1 ;
151143 continue ;
152144 }
153145 }
154146
155147 if (!self ::isReferencedName ($ phpcsFile , $ nameStartPointer )) {
148+ /** @var int $beginSearchAtPointer */
156149 $ beginSearchAtPointer = TokenHelper::findNextExcluding (
157150 $ phpcsFile ,
158151 array_merge (TokenHelper::$ ineffectiveTokenCodes , $ nameTokenCodes ),
@@ -369,74 +362,57 @@ private static function createAllReferencedNamesInAttributes(File $phpcsFile, in
369362
370363 $ tokens = $ phpcsFile ->getTokens ();
371364
372- $ attributeTokenCode = TokenHelper::getAttributeTokenCode ();
373-
374- $ possibleAttributePointers = TokenHelper::findNextAll ($ phpcsFile , $ attributeTokenCode , $ openTagPointer + 1 );
375-
376- foreach ($ possibleAttributePointers as $ possibleAttributePointer ) {
377- // @codeCoverageIgnoreStart
378- if (!StringHelper::startsWith ($ tokens [$ possibleAttributePointer ]['content ' ], '#[ ' )) {
379- continue ;
380- }
381- // @codeCoverageIgnoreEnd
382-
383- $ attributeStartPointer = $ possibleAttributePointer ;
384- $ attributeEndPointer = self ::getAttributeEndPointer ($ phpcsFile , $ attributeStartPointer );
385-
386- if ($ tokens [$ attributeStartPointer ]['code ' ] === T_COMMENT ) {
387- // @codeCoverageIgnoreStart
388- $ attributePhpcsFile = self ::getFakeAttributePhpcsFile ($ phpcsFile , $ attributeStartPointer , $ attributeEndPointer );
389- $ searchStartPointer = 0 ;
390- $ searchEndPointer = count ($ attributePhpcsFile ->getTokens ());
391- // @codeCoverageIgnoreEnd
392- } else {
393- $ attributePhpcsFile = $ phpcsFile ;
394- $ searchStartPointer = $ attributeStartPointer + 1 ;
395- $ searchEndPointer = $ attributeEndPointer ;
396- }
365+ $ attributePointers = TokenHelper::findNextAll ($ phpcsFile , T_ATTRIBUTE , $ openTagPointer + 1 );
397366
398- $ attributeTokens = $ attributePhpcsFile ->getTokens ();
367+ foreach ($ attributePointers as $ attributeStartPointer ) {
368+ $ searchStartPointer = $ attributeStartPointer + 1 ;
369+ $ searchEndPointer = $ tokens [$ attributeStartPointer ]['attribute_closer ' ];
399370
400371 $ searchPointer = $ searchStartPointer ;
401372 $ searchTokens = array_merge (TokenHelper::getNameTokenCodes (), [T_OPEN_PARENTHESIS , T_CLOSE_PARENTHESIS ]);
402373 $ level = 0 ;
403374 do {
404- $ pointer = TokenHelper::findNext ($ attributePhpcsFile , $ searchTokens , $ searchPointer , $ searchEndPointer );
375+ $ pointer = TokenHelper::findNext ($ phpcsFile , $ searchTokens , $ searchPointer , $ searchEndPointer );
405376
406377 if ($ pointer === null ) {
407378 break ;
408379 }
409380
410- if ($ attributeTokens [$ pointer ]['code ' ] === T_OPEN_PARENTHESIS ) {
381+ if ($ tokens [$ pointer ]['code ' ] === T_OPEN_PARENTHESIS ) {
411382 $ level ++;
412383 $ searchPointer = $ pointer + 1 ;
413384 continue ;
414385 }
415386
416- if ($ attributeTokens [$ pointer ]['code ' ] === T_CLOSE_PARENTHESIS ) {
387+ if ($ tokens [$ pointer ]['code ' ] === T_CLOSE_PARENTHESIS ) {
417388 $ level --;
418389 $ searchPointer = $ pointer + 1 ;
419390 continue ;
420391 }
421392
422- $ referencedNameEndPointer = self ::getReferencedNameEndPointer ($ attributePhpcsFile , $ pointer );
393+ $ referencedNameEndPointer = self ::getReferencedNameEndPointer ($ phpcsFile , $ pointer );
423394
424- $ pointerBefore = TokenHelper::findPreviousEffective ($ attributePhpcsFile , $ pointer - 1 );
395+ $ pointerBefore = TokenHelper::findPreviousEffective ($ phpcsFile , $ pointer - 1 );
425396
426- if (in_array ($ attributeTokens [$ pointerBefore ]['code ' ], [T_OPEN_TAG , $ attributeTokenCode ], true )) {
397+ if (in_array ($ tokens [$ pointerBefore ]['code ' ], [T_OPEN_TAG , T_ATTRIBUTE ], true )) {
427398 $ referenceType = ReferencedName::TYPE_CLASS ;
428- } elseif ($ attributeTokens [$ pointerBefore ]['code ' ] === T_COMMA && $ level === 0 ) {
399+ } elseif ($ tokens [$ pointerBefore ]['code ' ] === T_COMMA && $ level === 0 ) {
429400 $ referenceType = ReferencedName::TYPE_CLASS ;
430- } elseif (self ::isReferencedName ($ attributePhpcsFile , $ pointer )) {
431- $ referenceType = self ::getReferenceType ($ attributePhpcsFile , $ pointer , $ referencedNameEndPointer );
401+ } elseif (self ::isReferencedName ($ phpcsFile , $ pointer )) {
402+ $ referenceType = self ::getReferenceType ($ phpcsFile , $ pointer , $ referencedNameEndPointer );
432403 } else {
433404 $ searchPointer = $ pointer + 1 ;
434405 continue ;
435406 }
436407
437- $ referencedName = self ::getReferenceName ($ attributePhpcsFile , $ pointer , $ referencedNameEndPointer );
408+ $ referencedName = self ::getReferenceName ($ phpcsFile , $ pointer , $ referencedNameEndPointer );
438409
439- $ referencedNames [] = new ReferencedName ($ referencedName , $ attributeStartPointer , $ attributeEndPointer , $ referenceType );
410+ $ referencedNames [] = new ReferencedName (
411+ $ referencedName ,
412+ $ attributeStartPointer ,
413+ $ tokens [$ attributeStartPointer ]['attribute_closer ' ],
414+ $ referenceType
415+ );
440416
441417 $ searchPointer = $ referencedNameEndPointer + 1 ;
442418
@@ -446,46 +422,4 @@ private static function createAllReferencedNamesInAttributes(File $phpcsFile, in
446422 return $ referencedNames ;
447423 }
448424
449- /**
450- * @codeCoverageIgnore
451- * @param File $phpcsFile
452- * @param int $commentAttributeStartPointer
453- * @param int $commentAttributeEndPointer
454- * @return File
455- */
456- private static function getFakeAttributePhpcsFile (
457- File $ phpcsFile ,
458- int $ commentAttributeStartPointer ,
459- int $ commentAttributeEndPointer
460- ): File
461- {
462- $ attributeContent = substr (TokenHelper::getContent ($ phpcsFile , $ commentAttributeStartPointer , $ commentAttributeEndPointer ), 2 , -2 );
463-
464- $ attributePhpcsFile = clone $ phpcsFile ;
465- $ attributePhpcsFile ->setContent ('<?php ' . trim ($ attributeContent ));
466- $ attributePhpcsFile ->parse ();
467-
468- return $ attributePhpcsFile ;
469- }
470-
471- /**
472- * @codeCoverageIgnore
473- * @param File $phpcsFile
474- * @param int $attributeStartPointer
475- * @return int
476- */
477- private static function getAttributeEndPointer (File $ phpcsFile , int $ attributeStartPointer ): int
478- {
479- $ tokens = $ phpcsFile ->getTokens ();
480-
481- if (
482- $ tokens [$ attributeStartPointer ]['code ' ] === T_COMMENT
483- && StringHelper::endsWith ($ tokens [$ attributeStartPointer ]['content ' ], '] ' . $ phpcsFile ->eolChar )
484- ) {
485- return $ attributeStartPointer ;
486- }
487-
488- return TokenHelper::findNext ($ phpcsFile , T_CLOSE_SQUARE_BRACKET , $ attributeStartPointer + 1 );
489- }
490-
491425}
0 commit comments