build(psalm): Configure unstable namespace
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