diff options
author | Kate <26026535+provokateurin@users.noreply.github.com> | 2024-11-29 12:01:07 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-29 12:01:07 +0100 |
commit | bcb8b85fc63f04fcbb3b97ce3acf661e74ddb006 (patch) | |
tree | f8956e9eb8befbdba0ccd0a99967d76ac2fe86b3 /build | |
parent | a4c3e0c4a07f1b5204b9bff100c1e10918a1214e (diff) | |
parent | 72571a19dd664c5cc79171369700d412d46c0e52 (diff) | |
download | nextcloud-server-bcb8b85fc63f04fcbb3b97ce3acf661e74ddb006.tar.gz nextcloud-server-bcb8b85fc63f04fcbb3b97ce3acf661e74ddb006.zip |
Merge pull request #49224 from nextcloud/build/psalm/unstable-namespace
Diffstat (limited to 'build')
-rw-r--r-- | build/files-checker.php | 1 | ||||
-rw-r--r-- | build/psalm/NcuExperimentalChecker.php | 122 |
2 files changed, 123 insertions, 0 deletions
diff --git a/build/files-checker.php b/build/files-checker.php index 3d3ec923eae..3231334efc3 100644 --- a/build/files-checker.php +++ b/build/files-checker.php @@ -69,6 +69,7 @@ $expectedFiles = [ 'ocs-provider', 'package-lock.json', 'package.json', + 'psalm-ncu.xml', 'psalm-ocp.xml', 'psalm.xml', 'public.php', diff --git a/build/psalm/NcuExperimentalChecker.php b/build/psalm/NcuExperimentalChecker.php new file mode 100644 index 00000000000..d5c24333d9e --- /dev/null +++ b/build/psalm/NcuExperimentalChecker.php @@ -0,0 +1,122 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +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 NcuExperimentalChecker 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::checkMethodOrConstantComment($method, $statementsSource, 'method'); + } + + foreach ($stmt->getConstants() as $constant) { + self::checkMethodOrConstantComment($constant, $statementsSource, 'constant'); + } + } + + 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 NCU.', + 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['experimental'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + '@experimental is required for classes/interfaces in NCU.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + + if (isset($parsedDocblock->tags['depreacted'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Typo in @deprecated for classes/interfaces in NCU.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + } + + private static function checkMethodOrConstantComment(Stmt $stmt, FileSource $statementsSource, string $type): void { + $docblock = $stmt->getDocComment(); + + if ($docblock === null) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'PHPDoc is required for ' . $type . 's in NCU.', + 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['experimental'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + '@experimental is required for ' . $type . 's in NCU.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + + if (isset($parsedDocblock->tags['depreacted'])) { + IssueBuffer::maybeAdd( + new InvalidDocblock( + 'Typo in @deprecated for ' . $type . ' in NCU.', + new CodeLocation($statementsSource, $stmt) + ) + ); + } + } +} |