44
55use PHP_CodeSniffer \Files \File ;
66use PHP_CodeSniffer \Sniffs \Sniff ;
7+ use PHP_CodeSniffer \Util \Tokens ;
78use SlevomatCodingStandard \Helpers \ClassHelper ;
89use SlevomatCodingStandard \Helpers \SniffSettingsHelper ;
910use SlevomatCodingStandard \Helpers \TokenHelper ;
1011use function count ;
12+ use function in_array ;
1113use function sprintf ;
1214use function substr_count ;
1315use const T_ANON_CLASS ;
@@ -74,14 +76,22 @@ private function checkLinesBeforeFirstUse(File $phpcsFile, int $firstUsePointer)
7476 {
7577 $ tokens = $ phpcsFile ->getTokens ();
7678
79+ $ useStartPointer = $ firstUsePointer ;
80+
7781 /** @var int $pointerBeforeFirstUse */
7882 $ pointerBeforeFirstUse = TokenHelper::findPreviousExcluding ($ phpcsFile , T_WHITESPACE , $ firstUsePointer - 1 );
83+
84+ if (in_array ($ tokens [$ pointerBeforeFirstUse ]['code ' ], Tokens::$ commentTokens , true )) {
85+ $ pointerBeforeFirstUse = TokenHelper::findPreviousEffective ($ phpcsFile , $ pointerBeforeFirstUse - 1 );
86+ $ useStartPointer = TokenHelper::findNext ($ phpcsFile , Tokens::$ commentTokens , $ pointerBeforeFirstUse + 1 );
87+ }
88+
7989 $ isAtTheStartOfClass = $ tokens [$ pointerBeforeFirstUse ]['code ' ] === T_OPEN_CURLY_BRACKET ;
8090
8191 $ whitespaceBeforeFirstUse = '' ;
8292
8393 if ($ pointerBeforeFirstUse + 1 !== $ firstUsePointer ) {
84- $ whitespaceBeforeFirstUse .= TokenHelper::getContent ($ phpcsFile , $ pointerBeforeFirstUse + 1 , $ firstUsePointer - 1 );
94+ $ whitespaceBeforeFirstUse .= TokenHelper::getContent ($ phpcsFile , $ pointerBeforeFirstUse + 1 , $ useStartPointer - 1 );
8595 }
8696
8797 $ requiredLinesCountBeforeFirstUse = SniffSettingsHelper::normalizeInteger ($ this ->linesCountBeforeFirstUse );
@@ -91,6 +101,7 @@ private function checkLinesBeforeFirstUse(File $phpcsFile, int $firstUsePointer)
91101 ) {
92102 $ requiredLinesCountBeforeFirstUse = SniffSettingsHelper::normalizeInteger ($ this ->linesCountBeforeFirstUseWhenFirstInClass );
93103 }
104+
94105 $ actualLinesCountBeforeFirstUse = substr_count ($ whitespaceBeforeFirstUse , $ phpcsFile ->eolChar ) - 1 ;
95106
96107 if ($ actualLinesCountBeforeFirstUse === $ requiredLinesCountBeforeFirstUse ) {
@@ -206,7 +217,14 @@ private function checkLinesBetweenUses(File $phpcsFile, array $usePointers): voi
206217 $ previousUseEndPointer = $ tokens [$ previousUseEndPointer ]['bracket_closer ' ];
207218 }
208219
209- $ actualLinesCountAfterPreviousUse = $ tokens [$ usePointer ]['line ' ] - $ tokens [$ previousUseEndPointer ]['line ' ] - 1 ;
220+ $ useStartPointer = $ usePointer ;
221+ $ pointerBeforeUse = TokenHelper::findPreviousExcluding ($ phpcsFile , T_WHITESPACE , $ usePointer - 1 );
222+
223+ if (in_array ($ tokens [$ pointerBeforeUse ]['code ' ], Tokens::$ commentTokens , true )) {
224+ $ useStartPointer = TokenHelper::findNext ($ phpcsFile , Tokens::$ commentTokens , TokenHelper::findPreviousEffective ($ phpcsFile , $ pointerBeforeUse - 1 ) + 1 );
225+ }
226+
227+ $ actualLinesCountAfterPreviousUse = $ tokens [$ useStartPointer ]['line ' ] - $ tokens [$ previousUseEndPointer ]['line ' ] - 1 ;
210228
211229 if ($ actualLinesCountAfterPreviousUse === $ requiredLinesCountBetweenUses ) {
212230 $ previousUsePointer = $ usePointer ;
0 commit comments