diff --git a/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php b/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php index 7c6e55fb84..0a31c0d23c 100644 --- a/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php +++ b/src/Standards/PSR2/Sniffs/Namespaces/UseDeclarationSniff.php @@ -138,17 +138,32 @@ public function process(File $phpcsFile, $stackPtr) } $end = $phpcsFile->findNext(T_SEMICOLON, ($stackPtr + 1)); - $candidateComment = $end; + if ($end === false) { + return; + } + + // Find either the start of the next line or the beginning of the next statement, + // whichever comes first. + for ($end = ++$end; $end < $phpcsFile->numTokens; $end++) { + if (isset(Tokens::$emptyTokens[$tokens[$end]['code']]) === false) { + break; + } - do { - $nextComment = $candidateComment; - $candidateComment = $phpcsFile->findNext(Tokens::$emptyTokens, ($nextComment + 1)); - } while ($candidateComment !== false && $tokens[$candidateComment]['line'] === $tokens[$end]['line']); + if ($tokens[$end]['column'] === 1) { + // Reached the next line. + break; + } + } - $end = $nextComment; + --$end; - if ($end === false) { - return; + if (($tokens[$end]['code'] === T_COMMENT + || isset(Tokens::$phpcsCommentTokens[$tokens[$end]['code']]) === true) + && substr($tokens[$end]['content'], 0, 2) === '/*' + && substr($tokens[$end]['content'], -2) !== '*/' + ) { + // Multi-line block comments are not allowed as trailing comment after a use statement. + --$end; } $next = $phpcsFile->findNext(T_WHITESPACE, ($end + 1), null, true); diff --git a/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc b/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc new file mode 100644 index 0000000000..2bf9ceed8c --- /dev/null +++ b/src/Standards/PSR2/Tests/Namespaces/UseDeclarationUnitTest.11.inc @@ -0,0 +1,2 @@ + 1, ]; case 'UseDeclarationUnitTest.10.inc': + case 'UseDeclarationUnitTest.11.inc': + case 'UseDeclarationUnitTest.12.inc': + case 'UseDeclarationUnitTest.13.inc': + case 'UseDeclarationUnitTest.14.inc': return [2 => 1]; default: return [];