Signed-off-by: provokateurin <kate@provokateurin.de>pull/49224/head
parent
17659d327a
commit
72571a19dd
@ -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) |
||||
) |
||||
); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,21 @@ |
||||
<?xml version="1.0"?> |
||||
<!-- |
||||
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors |
||||
- SPDX-License-Identifier: AGPL-3.0-or-later |
||||
--> |
||||
<psalm |
||||
errorLevel="1" |
||||
resolveFromConfigFile="true" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xmlns="https://getpsalm.org/schema/config" |
||||
xsi:schemaLocation="https://getpsalm.org/schema/config" |
||||
findUnusedBaselineEntry="false" |
||||
findUnusedCode="false" |
||||
> |
||||
<plugins> |
||||
<plugin filename="build/psalm/NcuExperimentalChecker.php"/> |
||||
</plugins> |
||||
<projectFiles> |
||||
<directory name="lib/unstable"/> |
||||
</projectFiles> |
||||
</psalm> |
Loading…
Reference in new issue