From 918a69689299d76819f6553456c31da051dea549 Mon Sep 17 00:00:00 2001 From: Anastasiia Sherekina Date: Mon, 16 Jun 2025 19:29:13 +0300 Subject: [PATCH] change logic phpDoc comment sniff --- .../Commenting/ProhibitedDocCommentsSniff.php | 61 +++---------------- .../Sniffs/Namespace/NamespaceSniff.php | 1 + src/PhpStan/MethodCallConsistencyRule.php | 3 + .../ProhibitedDocCommentsSniffTest.php | 14 ++--- .../prohibited-doc-comments/success.php | 4 ++ .../prohibited-doc-comments/wrong.php | 6 -- 6 files changed, 22 insertions(+), 67 deletions(-) diff --git a/src/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniff.php b/src/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniff.php index 93d3227..2e3ce6a 100644 --- a/src/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniff.php +++ b/src/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniff.php @@ -30,6 +30,7 @@ public function process(File $phpcsFile, mixed $stackPtr): void { $tokens = $phpcsFile->getTokens(); $commentToken = $tokens[$stackPtr]; + $closePtr = $phpcsFile->findNext(T_DOC_COMMENT_CLOSE_TAG, $stackPtr + 1); $possiblyDeclaration = $phpcsFile->findNext([ T_CLASS, T_INTERFACE, T_TRAIT, T_FUNCTION, @@ -40,65 +41,21 @@ public function process(File $phpcsFile, mixed $stackPtr): void return; } - $varPtr = $phpcsFile->findNext(T_VARIABLE, $commentToken['comment_closer'] + 1, local: true); + $hasMetaTag = false; - if ($varPtr) { - $commentTokenPtr = $phpcsFile->findNext(T_DOC_COMMENT_TAG, ($stackPtr + 1), $commentToken['comment_closer'], local: true); - - if (false === $commentTokenPtr) { - $phpcsFile->addError( - 'PHPDoc comment can contains only @var here.', - $stackPtr, - ErrorCodes::PHPDOC_NOT_ALLOWED - ); - - return; + for ($i = $stackPtr + 1; $i < $closePtr; $i++) { + if ($tokens[$i]['code'] === T_DOC_COMMENT_TAG) { + $hasMetaTag = true; + break; } } - $isOnlyVarTag = $this->isHasOnlyVarTag($phpcsFile, $stackPtr, $commentToken['comment_closer'], $tokens); - - if (true === $isOnlyVarTag) { - return; - } - - $phpcsFile->addError( - 'PHPDoc comment is not allowed here.', - $stackPtr, - ErrorCodes::PHPDOC_NOT_ALLOWED - ); - } - - /** - * Check has T_DOC_COMMENT_TAG another tags - * - * @param File $phpcsFile - * @param int $startPtr - * @param int $endPtr - * @param array $tokens - * - * @return bool|null - */ - private function isHasOnlyVarTag(File $phpcsFile, int $startPtr, int $endPtr, array $tokens): ?bool - { - $commentTokenPtr = $phpcsFile->findNext(T_DOC_COMMENT_TAG, ($startPtr + 1), $endPtr); - - if (false === $commentTokenPtr) { - return null; - } - - if ($commentTokenPtr && $tokens[$commentTokenPtr]['content'] !== '@var') { + if (!$hasMetaTag) { $phpcsFile->addError( - \sprintf('PHPDoc comment tag %s is not allowed here.', $tokens[$commentTokenPtr]['content']), - $commentTokenPtr, + 'PHPDoc must contain at least one meta tag like @param, @return, etc.', + $stackPtr, ErrorCodes::PHPDOC_NOT_ALLOWED ); - - return false; } - - $this->isHasOnlyVarTag($phpcsFile, $commentTokenPtr, $endPtr, $tokens); - - return true; } } diff --git a/src/PhpCs/FiveLab/Sniffs/Namespace/NamespaceSniff.php b/src/PhpCs/FiveLab/Sniffs/Namespace/NamespaceSniff.php index 728884c..f46574d 100644 --- a/src/PhpCs/FiveLab/Sniffs/Namespace/NamespaceSniff.php +++ b/src/PhpCs/FiveLab/Sniffs/Namespace/NamespaceSniff.php @@ -82,6 +82,7 @@ private function getExpectedNamespace(File $phpcsFile): ?string * @param string $composerJsonPath * * @return array + * * @throws \JsonException */ private function loadComposerJson(string $composerJsonPath): array diff --git a/src/PhpStan/MethodCallConsistencyRule.php b/src/PhpStan/MethodCallConsistencyRule.php index 33e964d..013994a 100644 --- a/src/PhpStan/MethodCallConsistencyRule.php +++ b/src/PhpStan/MethodCallConsistencyRule.php @@ -62,6 +62,7 @@ public function processNode(Node $node, Scope $scope): array * @param Scope $scope * * @return list + * * @throws ShouldNotHappenException */ private function checkStaticCall(Node\Expr\StaticCall $node, Scope $scope): array @@ -96,6 +97,7 @@ private function checkStaticCall(Node\Expr\StaticCall $node, Scope $scope): arra * @param Scope $scope * * @return list + * * @throws ShouldNotHappenException */ private function checkInstanceCall(Node\Expr\MethodCall $node, Scope $scope): array @@ -130,6 +132,7 @@ private function checkInstanceCall(Node\Expr\MethodCall $node, Scope $scope): ar * @param Scope $scope * * @return list + * * @throws ShouldNotHappenException|MissingMethodFromReflectionException */ private function checkNativeMethodCall(Node\Expr\StaticCall $node, Scope $scope): array diff --git a/tests/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniffTest.php b/tests/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniffTest.php index cfe0916..9094771 100644 --- a/tests/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniffTest.php +++ b/tests/PhpCs/FiveLab/Sniffs/Commenting/ProhibitedDocCommentsSniffTest.php @@ -33,27 +33,23 @@ public static function provideDataSet(): array 'wrong' => [ __DIR__.'/Resources/prohibited-doc-comments/wrong.php', [ - 'message' => 'PHPDoc comment is not allowed here.', + 'message' => 'PHPDoc must contain at least one meta tag like @param, @return, etc.', 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', ], [ - 'message' => 'PHPDoc comment can contains only @var here.', + 'message' => 'PHPDoc must contain at least one meta tag like @param, @return, etc.', 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', ], [ - 'message' => 'PHPDoc comment can contains only @var here.', + 'message' => 'PHPDoc must contain at least one meta tag like @param, @return, etc.', 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', ], [ - 'message' => 'PHPDoc comment tag @return is not allowed here.', + 'message' => 'PHPDoc must contain at least one meta tag like @param, @return, etc.', 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', ], [ - 'message' => 'PHPDoc comment can contains only @var here.', - 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', - ], - [ - 'message' => 'PHPDoc comment is not allowed here.', + 'message' => 'PHPDoc must contain at least one meta tag like @param, @return, etc.', 'source' => 'FiveLab.Commenting.ProhibitedDocComments.PhpDocNotAllowed', ], ], diff --git a/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/success.php b/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/success.php index 12298a4..b784fad 100644 --- a/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/success.php +++ b/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/success.php @@ -9,6 +9,10 @@ class Some { * @var string */ private string $foo; + + /** + * @see some456 + */ public const FOO = 'foo'; const BAR = 'bar'; diff --git a/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/wrong.php b/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/wrong.php index 655ff5d..7e4755e 100644 --- a/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/wrong.php +++ b/tests/PhpCs/FiveLab/Sniffs/Commenting/Resources/prohibited-doc-comments/wrong.php @@ -22,12 +22,6 @@ public function bar(): void $foo2 = 'bar'; }; - /** - * @var int $bar - * @return string - */ - $bar = 1; - /** * Some comment */