diff options
author | Daniel Kesselberg <mail@danielkesselberg.de> | 2023-01-17 10:47:22 +0100 |
---|---|---|
committer | Daniel Kesselberg <mail@danielkesselberg.de> | 2023-01-24 10:02:41 +0100 |
commit | 258c919b3c2a5211b4c792c41e37d0bad8d451ea (patch) | |
tree | 399089a4f480e58ea579a49989d0c22320918a15 /build/psalm/OcpSinceChecker.php | |
parent | f867a2d65e825800d6bf1b685659677f6136ac5f (diff) | |
download | nextcloud-server-258c919b3c2a5211b4c792c41e37d0bad8d451ea.tar.gz nextcloud-server-258c919b3c2a5211b4c792c41e37d0bad8d451ea.zip |
ci: migrate ocp since checker to psalm
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
Diffstat (limited to 'build/psalm/OcpSinceChecker.php')
-rw-r--r-- | build/psalm/OcpSinceChecker.php | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/build/psalm/OcpSinceChecker.php b/build/psalm/OcpSinceChecker.php new file mode 100644 index 00000000000..62b555284ac --- /dev/null +++ b/build/psalm/OcpSinceChecker.php @@ -0,0 +1,115 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright 2023 Daniel Kesselberg <mail@danielkesselberg.de> + * + * @author 2023 Daniel Kesselberg <mail@danielkesselberg.de> + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +use PhpParser\Node\Stmt; +use PhpParser\Node\Stmt\ClassLike; +use Psalm\CodeLocation; +use Psalm\DocComment; +use Psalm\Exception\DocblockParseException; +use Psalm\FileSource; +use Psalm\Issue\InvalidDocblock; +use Psalm\IssueBuffer; +use Psalm\Plugin\EventHandler\Event\AfterClassLikeVisitEvent; + +class OcpSinceChecker implements Psalm\Plugin\EventHandler\AfterClassLikeVisitInterface { + public static function afterClassLikeVisit(AfterClassLikeVisitEvent $event): void { + $stmt = $event->getStmt(); + $statementsSource = $event->getStatementsSource(); + + self::checkClassComment($stmt, $statementsSource); + + foreach ($stmt->getMethods() as $method) { + self::checkMethodComment($method, $statementsSource); + } + } + + private static function checkClassComment(ClassLike $stmt, FileSource $statementsSource): void { + $docblock = $stmt->getDocComment(); + + if ($docblock === null) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'PHPDoc is required for classes/interfaces in OCP.', + new CodeLocation($statementsSource, $stmt) + ) + ); + return; + } + + try { + $parsedDocblock = DocComment::parsePreservingLength($docblock); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statementsSource, $stmt) + ) + ); + return; + } + + if (!isset($parsedDocblock->tags['since'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + '@since is required for classes/interfaces in OCP.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + } + + private static function checkMethodComment(Stmt $stmt, FileSource $statementsSource): void { + $docblock = $stmt->getDocComment(); + + if ($docblock === null) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'PHPDoc is required for methods in OCP.', + new CodeLocation($statementsSource, $stmt) + ), + ); + return; + } + + try { + $parsedDocblock = DocComment::parsePreservingLength($docblock); + } catch (DocblockParseException $e) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + $e->getMessage(), + new CodeLocation($statementsSource, $stmt) + ) + ); + return; + } + + if (!isset($parsedDocblock->tags['since'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + '@since is required for methods in OCP.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + } +} |