diff --git a/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php b/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php index a94a6482a6..bdeb6d4242 100644 --- a/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php +++ b/src/Standards/Generic/Sniffs/Commenting/TodoSniff.php @@ -11,7 +11,6 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; -use PHP_CodeSniffer\Util\Tokens; class TodoSniff implements Sniff { @@ -55,27 +54,44 @@ public function register() */ public function process(File $phpcsFile, $stackPtr) { - $tokens = $phpcsFile->getTokens(); - + $tokens = $phpcsFile->getTokens(); $content = $tokens[$stackPtr]['content']; $matches = []; - preg_match('/(?:\A|[^\p{L}]+)todo([^\p{L}]+(.*)|\Z)/ui', $content, $matches); - if (empty($matches) === false) { - // Clear whitespace and some common characters not required at - // the end of a to-do message to make the warning more informative. - $type = 'CommentFound'; - $todoMessage = trim($matches[1]); - $todoMessage = trim($todoMessage, '-:[](). '); - $error = 'Comment refers to a TODO task'; - $data = [$todoMessage]; - if ($todoMessage !== '') { - $type = 'TaskFound'; - $error .= ' "%s"'; + + if (preg_match('/(?:\A|[^\p{L}]+)todo([^\p{L}]+(.*)|\Z)/ui', $content, $matches) !== 1) { + return; + } + + // Clear whitespace and some common characters not required at + // the end of a to-do message to make the warning more informative. + $todoMessage = trim($matches[1]); + $todoMessage = trim($todoMessage, '-:[](). '); + + if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_TAG + && $todoMessage === '' + ) { + $nextNonEmpty = $phpcsFile->findNext(T_DOC_COMMENT_WHITESPACE, ($stackPtr + 1), null, true); + if ($nextNonEmpty !== false + && $tokens[$nextNonEmpty]['code'] === T_DOC_COMMENT_STRING + ) { + $todoMessage = trim($tokens[$nextNonEmpty]['content'], '-:[](). '); } + } + + $error = 'Comment refers to a TODO task'; + $type = 'CommentFound'; + $data = [$todoMessage]; + if ($todoMessage !== '') { + $error .= ' "%s"'; + $type = 'TaskFound'; + } - $phpcsFile->addWarning($error, $stackPtr, $type, $data); + if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_TAG) { + $type .= 'InDocblock'; } + $phpcsFile->addWarning($error, $stackPtr, $type, $data); + }//end process() diff --git a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc index 64c624cead..d2a69f0b15 100644 --- a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc +++ b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.inc @@ -21,3 +21,15 @@ Debug::bam('test'); //TODO. //étodo //todoé + +/** + * @todo This message should be picked up. + * @todo: This message should be picked up too. + * @todo - here is a message + * + * The below should not show a message as there is no description associated with the tag. + * @todo + * @anothertag + * + * @param string $something TODO: add description + */ diff --git a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js index 8f01ca17f3..0133233c57 100644 --- a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js +++ b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.js @@ -21,3 +21,15 @@ alert('test'); //TODO. //étodo //todoé + +/** + * @todo This message should be picked up. + * @todo: This message should be picked up too. + * @todo - here is a message + * + * The below should not show a message as there is no description associated with the tag. + * @todo + * @anothertag + * + * @param string $something TODO: add description + */ diff --git a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php index 0651595326..a6f7b73126 100644 --- a/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php +++ b/src/Standards/Generic/Tests/Commenting/TodoUnitTest.php @@ -53,6 +53,11 @@ public function getWarningList($testFile='TodoUnitTest.inc') 16 => 1, 18 => 1, 21 => 1, + 26 => 1, + 27 => 1, + 28 => 1, + 31 => 1, + 34 => 1, ]; }//end getWarningList()